̃Gg[͂ĂȃubN}[Nɒlj

PostgreSQL :: NOT EXISTS / EXCEPT



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

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


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

  • table: fuga
val
a
b
c


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

  • table: hoge
idval
1a
1b
1c
2a
2b
2x
3b
3c
3x
4z
4x
5v
5x
6b
6c
6a



  • SQL)
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


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




database/postgresql/statement/not_exists-except.txt