相関サブクエリは、外部クエリの現在の行に依存します。 相関サブクエリは、外部クエリによって処理される行ごとに 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 );