Invantive UniversalSQL における相関サブクエリ

サブクエリは現在、周囲のクエリの列を使用することができます。

これにより、「この行に対応する行」を記述するための一般的な方法がInvantive UniversalSQLで利用可能になり、以下の例に示されるように、これまでこのようなサブクエリでは列が不明であるというメッセージが表示されていました。

動作

サブクエリは最初に自身のデータソースで名前を探します。そこで名前を見つけられなかった場合、周囲のクエリを参照し、さらにその外側のクエリを見ることになります。同じ名前が両方の場所に存在する場合、一番近いものを参照します。したがって、テーブルに列を追加しても既存のサブクエリの意味を変えることはありません。

相関関係は任意のレベルまで外部に広がり、レベルを飛ばすことができます。2レベル深いサブクエリは、中間のクエリが関与しなくても外部クエリの列を使用できます。

相関関係はサブクエリによってサポートされない場合と同じ形式で使用できます:exists、not exists、in、not in、およびスカラサブクエリ。最後のスカラサブクエリは1つの値を返し、式が許可されるどこでも使用可能で、セレクトリスト、計算、caseの中でも使用できます。

例: 対応する行が存在するか

以下の例は、第二のデータセットに存在する部門に所属する従業員を選択します。サブクエリは、周囲のクエリの列であるemp.deptを使用しています:

select emp.code
from   ( select 'A100' code, 'SLS' dept
         union all
         select 'A200' code, 'ENG' dept
       ) emp
where  exists ( select 1
                from   ( select 'SLS' dept
                       ) dpt
                where  dpt.dept = emp.dept
              )

このクエリは、値A100を持つ1行を返します。従業員A200は、第二の集合に知られていない部門に所属しています。

例: 行ごとに1つの値

セレクトリスト内のスカラサブクエリは、各従業員に関連する行をカウントします:

select emp.code
,      ( select count(*)
         from   ( select 'A100' code
                  union all
                  select 'A100' code
                ) ord
         where  ord.code = emp.code
       ) orders
from   ( select 'A100' code
         union all
         select 'A200' code
       ) emp

このクエリは、A100に対して2つ、A200に対して0を返します。countがどの対応する行も持たない場合、結果はゼロになります。他の集計関数、例えばmaxまたはsumも同様に、その状況では空の値を返します。

空の値

空の値との比較は結果を持たず、その結果は形式によって異なります。existsでは、空の値と比較される行はマッチしないため、サブクエリは何も見つけません。not inでは、返された値に空の値が1つでも含まれていると結果が不確定になり、行は返されません。これは比較された値自体が空である場合も同様です。

プラットフォームへのリクエスト数

実行時に相関サブクエリは結合に書き換えられます。このため、データソースはクエリの列数に関係なく、一定回数だけ読み取られます。

この書き換えがないと、サブクエリは行ごとに1回実行されることになります。クラウドを通じてアクセスされるプラットフォームでは、1行ごとに1つのリクエストを意味します。

制限

order by内のサブクエリはまだサポートされていません。

利用可能性

相関サブクエリは、リリース27.0以降、すべてのプラットフォームで利用可能です。

参照