テーブルに複数回アクセスする自己結合やその他の手法は機能しますが、パフォーマンスが低下する可能性があり、より大きな ID セットに一般化する必要がある場合は扱いにくくなります。
1 人あたりの一致する行の数を数えることで、テーブルへの 1 回の参照でそれを行うことができます。
select personid from P
where licensetypeid in ('1','5')
group by personid
having count(*) = 2
より大きな licensetypeid 値が必要な場合は、これを簡単に拡張できます。
select personid from P
where licensetypeid in ('1','5','7')
group by personid
having count(*) = 3
(自己結合バージョンでは、追加の値ごとに追加の結合を追加する必要があります)
または、より大きなタイプのセットから少なくとも 2 つのタイプを持つ人を見つけたい場合は、次のようにします。
select personid from P
where licensetypeid in ('1','5', '7', '10')
group by personid
having count(*) >= 2
サンプル クエリとは異なり、licensetypeid は結果セットに含まれていません。何らかの理由でそれが必要な場合は、2 つの値の場合に簡単なトリックを実行できます。
select personid, min(licensetypeid) licensetype1, max(licensetypeid) licensetype2
from P
where licensetypeid in ('1','5')
group by personid
having count(*) = 2
しかし、より一般的なアプローチは、値を単純なコレクションにグループ化することです。
select personid, collect(licensetypeid) licensetypeidlist
from P
where licensetypeid in ('1','5')
group by personid
having count(*) = 2