相関サブクエリーといえば exists 述語ですが。
この exists 述語。ぐぐっても、使用例が概ね複雑(=相関クエリー)で理解が難しかったりするので、メモがてらまとめ。
exists とは 空集合(=∅)か、集合が存在するか(≠∅)を判定するための、関数らしきものです。
たとえば、以下のように記述すると EMP 表の全レコード数を表示します。サブクエリーが1件データを戻すからです。
SQL> select count(*) from EMP 2 where exists (select 1 from DUAL); COUNT(*) ---------- 14
しかし、以下のように記述すると 0 を表示します。サブクエリーが1件もデータを戻さないから(=0件だから)です。
SQL> select count(*) from EMP
2 where exists (select 1 from DUAL where DUMMY='A');
COUNT(*)
----------
0
要するに、exists とは集合に対する「is not NULL」のようなもの、だと思えばよいです。
exists は、非相関クエリーで使っても上記の通り結果は all or nothing にしかならないので、主に相関クエリーで使用されますが「exists = 相関クエリー」ではない点に注意です。
「やっぱりピンとこない」という場合は、以下と等価だと思ってもらっても OK です。(論理的には。実行速度とかは別の話。)
select count(*) from EMP where (select count(*) from DUAL) <> 0; COUNT(*) ---------- 14
ちなみに Oracle の DUAL 表とはこういう表。
SQL> select * from DUAL; DUMMY ----- X