Contents
- UNIX
- Windows
- サーバ
- プログラミング言語
- データベース
- プロトコル
- サービス
- オープンソース
- 規格・技術
- アプリケーション
- PC
- DEVICE
- その他(未分類)
お問合せ:
メールフォーム
NOT EXISTS と EXCEPT を利用して、『 val に「a,b,c」の3つの値すべてを持つid 』を探す。
まず、「a,b,c」のレコードを保持しているテーブル「fuga」
| val |
|---|
| a |
| b |
| c |
次に、検索対象のテーブル「hoge」
| id | val |
|---|---|
| 1 | a |
| 1 | b |
| 1 | c |
| 2 | a |
| 2 | b |
| 2 | x |
| 3 | b |
| 3 | c |
| 3 | x |
| 4 | z |
| 4 | x |
| 5 | v |
| 5 | x |
| 6 | b |
| 6 | c |
| 6 | a |
select * from hoge h1 where NOT EXISTS ( (select val from fuga) EXCEPT (select val from hoge h2 where h1.id=h2.id) )
↓
| id | val |
|---|---|
| 1 | a |
| 1 | b |
| 1 | c |
| 6 | b |
| 6 | c |
| 6 | a |
select distinct(id) from hoge h1 where NOT EXISTS ( (select val from fuga) EXCEPT (select val from hoge h2 where h1.id=h2.id) )
↓
| id |
|---|
| 1 |
| 6 |
考え方)
「select val from fuga」で取得したレコードの集合から
「select val from hoge h2 where h1.id=h2.id」で取得したレコードの集合を差し引いて、
レコード数が0になれば「偽」になります。(条件を満たすレコードがすべて存在していたことになる)
その後の評価 NOT EXISTS 句 が否定しているので、「偽」が返ってきた場合に「真」となり該当レコードが残る仕組みです。