|
|
|
|
レコードの存在の有無を条件にする(EXISTS) |
|
スポンサード リンク
レコードの存在有無を条件にするにはEXISTSを使用します
[NOT] EXISTS (SELECT文) |
SELECT文による副問合せの結果、行が1行以上戻される場合には、TRUE と評価されます |
IN句を使用するより、EXISTS句を使用する方が、パフォーマンスが大幅に改善されることがあるので、IN句を使用するときは、EXISTS句で代替することも検討しましょう。詳細はチューニングを参照。
サンプル表「emp」データ
|
SQL> select * from emp;
EMP DEP NAME SALARY
--- --- ---------- ----------
E01 D01 なまえ1 96
E02 D01 なまえ2 105
E03 D02 なまえ3 300
SQL> |
サンプル表「dept」データ
|
SQL> select * from dept;
DEP DEPT_NAME
--- ----------
D01 総務
D02 営業
D03 開発
D05
D04 営業 |
例1) 表「emp」の列「dept_id」が'D03'のレコードが存在する場合、表「dept」を検索する(EXISTS)
|
SQL> select * from dept
2 where exists( select 'X' from emp where dept_id = 'D03' );
レコードが選択されませんでした。
|
定数'X'はEXISTS句を使用する場合の慣例です。ここには上記の様な定数を指定しましょう
例2) 表「emp」の列「dept_id」が'D03'のレコードが存在しない場合、表「dept」を検索する(NOT EXISTS)
|
SQL> select * from dept
2 where not exists(select 'X' from emp where dept_id = 'D03');
DEP DEPT_NAME
--- ----------
D01 総務
D02 営業
D03 開発
D05
D04 営業
|
例3) 表「dept」の列「dept_id」のデータが表「emp」の列「dept_id」に存在するレコードを検索する。(EXISTS)
|
SQL> select * from dept A
2 where exists( select 'X' from emp B where A.dept_id = B.dept_id );
DEP DEPT_NAME
--- ----------
D01 総務
D02 営業
|
例4) 表「dept」の列「dept_id」のデータが表「emp」の列「dept_id」に存在しないレコードを検索する。(NOT EXISTS)
|
SQL> select * from dept A
2 where not exists( select 'X' from emp B where A.dept_id = B.dept_id
);
DEP DEPT_NAME
--- ----------
D04 営業
D03 開発
D05
|
スポンサード リンク
|
|
|
|
|
|