すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:相関サブクエリ

最終更新日:Apr 26, 2025

相関サブクエリは、外部クエリの現在の行に依存します。 相関サブクエリは、外部クエリによって処理される行ごとに 1 回実行されます。 大量のデータが関係する場合、クエリのパフォーマンスが低下します。 このトピックでは、相関サブクエリの使用法と一般的なエラーについて説明します。

前提条件

V3.1.9.0 以降の AnalyticDB for MySQL クラスタが作成されていること。

説明

AnalyticDB for MySQL クラスタのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、構成情報 セクションの クラスター情報 ページに移動します。

制限事項

相関列の制限

説明

サブクエリ内の相関列は、外部クエリからのものです。

  • 相関列は、サブクエリの WHERE 句でのみ参照できます。

  • 相関列は、別のサブクエリに含まれるサブクエリでは参照できません。例:

    SELECT * FROM ts1 WHERE ts1.a > 
        (SELECT MAX(ts3.c) FROM ts3 WHERE ts3.c IN 
            (SELECT ts2.a FROM ts2 WHERE ts1.b = ts2.b ) );

サブクエリの制限

  • サブクエリは JOIN 文に含めることはできません。

  • サブクエリにはウィンドウ関数は含められません。

  • サブクエリには、UNION などの集合演算を含めることはできません。例:

    SELECT * FROM ts1 WHERE ts1.a IN 
        (SELECT ts2.a FROM ts2 WHERE ts1.b = ts2.b UNION SELECT ts3.a FROM ts3 );
  • IN 句のサブクエリには、LIMIT、GROUP BY、ORDER BY、または JOIN を含めることはできません。例:

    SELECT * FROM ts1 WHERE ts1.a IN 
        (SELECT ts2.a FROM ts2 WHERE ts1.b = ts2.b LIMIT 10);
    SELECT * FROM ts1 WHERE ts1.a IN 
        (SELECT AVG(ts2.a) FROM ts2 WHERE ts1.b = ts2.b GROUP BY ts2.c );

相関サブクエリを使用して、製品の最小割引をクエリします。

SELECT id,  
    (SELECT MIN(discount)
    FROM item
    WHERE goods.id = goods_id )
FROM goods;

JOIN 句を使用して、上記の相関サブクエリを書き直します。

SELECT id,t.min_discount
FROM goods
LEFT JOIN 
    (SELECT goods_id,
         MIN(discount) AS min_discount
    FROM item
    GROUP BY  goods_id ) t
    ON t.goods_id = goods.id;

一般的なエラー

Given correlated subquery with correlation: [column_name] is not supported

原因:相関列は、サブクエリの WHERE 句でのみ参照できます。 相関サブクエリが使用されると、AnalyticDB for MySQL は相関サブクエリを共通サブクエリに非相関化します。 相関列がサブクエリの SELECT 句で参照されている場合、非相関化は失敗し、エラーが発生します。

次のサンプル文では、ts1.a という名前の相関列がサブクエリの SELECT 句で参照されています。 この場合、非相関化は失敗し、エラーが発生します。

SELECT ts1.a,
    (SELECT SUM(ts2.a) + ts1.a
    FROM ts2
    WHERE ts1.b = ts2.b )
FROM ts1;

解決方法:

  • 方法 1:サブクエリの SELECT 句から相関列を削除します。

    SELECT ts1.a,    
        (SELECT SUM(ts2.a)
        FROM ts2
        WHERE ts1.b = ts2.b ) + ts1.a
    FROM ts1;
  • 方法 2:JOIN 句を使用して相関サブクエリを書き直します。

    SELECT ts1.a,
             tt.suma + ts1.a
    FROM ts1
    LEFT JOIN 
        (SELECT ts2.b AS b,
             SUM(ts2.a) AS suma
        FROM ts2
        GROUP BY  ts2.b ) tt
        ON ts1.b = tt.b;

Scalar sub-query has returned multiple rows

原因:相関サブクエリが複数の行を返す場合、エラーが発生します。 相関サブクエリが行を返さないか、1 行だけを返す場合、エラーは発生しません。

次のサンプル文では、外部クエリの WHERE 句で等価条件が使用され、相関サブクエリが複数の行を返します。 この場合、エラーが発生します。

SELECT ts1.a
FROM ts1
WHERE ts1.a = 
    (SELECT ts2.a
    FROM ts2
    WHERE ts1.b = ts2.b );

解決方法:上記の SQL 構文に基づいて、外部クエリの等価条件を IN 条件に変更します。

SELECT ts1.a
FROM ts1
WHERE ts1.a IN 
    (SELECT ts2.a
    FROM ts2
    WHERE ts1.b = ts2.b );