PostgreSQL :: NOT EXISTS / EXCEPT

条件を満たす全てのレコードが存在するレコードを検索する

NOT EXISTS と EXCEPT を利用して、『 val に「a,b,c」の3つの値すべてを持つid 』を探す。


まず、「a,b,c」のレコードを保持しているテーブル「fuga」

val
a
b
c


次に、検索対象のテーブル「hoge」

idval
1a
1b
1c
2a
2b
2x
3b
3c
3x
4z
4x
5v
5x
6b
6c
6a



select * from hoge h1 where NOT EXISTS
(
  (select val from fuga)
  EXCEPT
  (select val from hoge h2 where h1.id=h2.id)
)

idval
1a
1b
1c
6b
6c
6a


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