OracleのEXISTS(相関副問い合わせ)
Oracleで副問合せに行が存在するかどうかを取得するには「EXISTS」を使います。
今回は「EXISTS」の使い方を紹介します。
WHERE EXISTS(副問い合わせSQL)
副問い合わせSQLがtrueであれば、データが取得できます。
サンプルデータ
--empテーブルを取得する SELECT empno, empname, managerno FROM emp;
empno | empname | managerno |
A001 | 佐藤花子 | A005 |
A002 | 田中太郎 | A004 |
A003 | 加藤一 | |
A004 | 青木花 | |
A005 | 藤田学 |
--テニスサークルを取得する SELECT empno FROM act_tennis;
empno |
A001 |
A005 |
例1. EXISTSで2テーブルに合致するレコードを取得する
--テニスサークルの人を取得する SELECT empno,empname FROM emp e WHERE EXISTS (SELECT * FROM act_tennis a WHERE a.empno = e.empno );
empno | empname |
A001 | 佐藤花子 |
A005 | 藤田学 |
ここでは「emp」テーブルと「act_tennis」テーブルをキー「empno」で副問い合わせを使って取得しました。これにより、2テーブルに合致するレコードのみが取得できました。
例2. EXISTSで同一テーブルに合致するレコードを取得する
--役職ありの人を取得する SELECT empno,empname FROM emp e1 WHERE EXISTS (SELECT * FROM emp e2 WHERE e1.empno = e2.managerno );
empno | empname |
A004 | 青木花 |
A005 | 藤田学 |
ここでは「emp」テーブル単独で副問い合わせを使い、役職付きの人を取得しました。「empno」と「managerno」が合致する行、つまり、「A004」「A005」が取得できました。
例3. NOT EXISTS
--役職ありの人以外を取得する SELECT empno,empname FROM emp e1 WHERE NOT EXISTS (SELECT * FROM emp e2 WHERE e1.empno = e2.managerno ) ;
empno | empname |
A001 | 佐藤花子 |
A002 | 田中太郎 |
A003 | 加藤一 |
「NOT EXISTS」を使って条件に合致しないレコードを取得しました。ここでは役職付きではない人を取得しました。
以上、OracleのEXISTSの使い方でした。
コメント