ルールと制限を以下に示します。
- 相関サブクエリーを使用して、外部問合わせのテーブルとサブクエリーのテーブルの等価または非等価の組み合わせを指定することができます。
例えば以下のSELECT文は、サブクエリー内に等価の条件を指定し、主問合わせ内に非等価の条件を指定しています。
SELECT * FROM table_1 WHERE x < ALL (SELECT y FROM table_2 WHERE table_2.n = table_1.n);
- 相関サブクエリーは深さ64の入れ子にすることができます。
例えば以下のSELECT文は、3重の入れ子を指定します。
SELECT * FROM table_1 WHERE x = (SELECT y FROM table_2 WHERE table_2.n = table_1.n AND t2.m = (SELECT y FROM table_3 WHERE table_3.n = table_2.m AND table_1.l = table_3.l));
- 相関サブクエリーは、外問合わせのFROM句内に指定されているテーブルと同じテーブルを参照することができます。
内テーブルと外テーブルへの参照を区別するために、一方のテーブルの名前を相関名に変える必要があります。
最初の例では外テーブルに別名が付けられるのに対して、2番目の例では内テーブルに別名が付けられます。
また、最初の例では外部参照はa.nですが、2番目の例では外部参照はtable_1.nです。
SELECT * FROM table_1 AS a WHERE x < (SELECT AVG(table_1.x) FROM table_1 WHERE table_1.n = a.n); SELECT * FROM table_1 WHERE x < (SELECT AVG(a.x) FROM table_1 AS a WHERE table_1.n = a.n);
- 相関サブクエリーにSELECT AND CONSUME文を含めることはできません。
- 相関サブクエリーにTOP n演算子を含めることはできません。
- SELECTは、外問合わせ、主問合わせ、またはサブクエリーで指定できます。
SELECTの指定 説明 メイン クエリー その主問合わせで参照されるテーブルはすべて、主問合わせのSELECTのFROM句に指定しなければなりません。 subquery そのサブクエリーで参照されるテーブルはすべて、サブクエリーのFROM句または外問合わせに指定しなければなりません。 サブクエリーのselect式リストにおいて、外問合わせのFROM句のテーブルへの列参照が指定されている場合、その列参照は完全修飾の参照でなければなりません。
修飾されていない列参照が相関条件に指定されている場合、現行サブクエリーに含まれるテーブルとビューから列がVantageによって検索され、見つからない場合は、順次、その外側の問合わせのテーブルとビューの中から列が検索されていきます。
- 相関サブクエリーは、次の条件でFROM句で指定することができます。
サブクエリーで参照されるテーブルの参照場所 テーブル参照の状態 サブクエリー テーブル参照はローカルでサブクエリーは非相関になります。 外問合わせのFROM句 テーブル参照はローカルでなくサブクエリーは相関になります。
以下のルールは、相関サブクエリーでFROM句を指定する際に適用されます。
- どのサブクエリーの指定にも、FROM句は必須です。
- FROM句は、外問合わせでは必須ではありません。ただし、将来のリリースでANSI SQL:2011ルールが適用された場合、SELECT内で参照するすべてのテーブルをFROM句に指定する必要が生じるので、常にFROM句を指定するようにアプリケーションを作成しなければなりません。さらに重要な点として、FROM句にテーブルを明示的に指定すると、よりわかりやすくなるため、問合わせのコーディング時にエラーを防ぐ助けになります。
Vantageは、FROM句に参照テーブルを指定しないと警告メッセージを返します。