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 句 が否定しているので、「偽」が返ってきた場合に「真」となり該当レコードが残る仕組みです。