これが集合内集合問題と呼ばれるものです。カテゴリのいずれかで一致を見つける最良の方法は、次のアプローチだと思います。
select ADVERTISEMENTID
from t
group by ADVERTISEMENTID
having sum(case when categoryid = 'A' then 1 else 0 end) > 0 or
sum(case when categoryid = 'B' then 1 else 0 end) > 0 or
sum(case when categoryid = 'C' then 1 else 0 end) > 0
つまり、これはadvertisementid
各カテゴリ値を個別に比較して集計しています。ステートメントは、sum()
それが存在する数を数えています。はor
、これらのいずれかが真でなければならないと言っています。
サブセット関係の場合、一致しないものをカウントするための句をもう 1 つ追加します。
select ADVERTISEMENTID
from t
group by ADVERTISEMENTID
having (sum(case when categoryid = 'A' then 1 else 0 end) > 0 or
sum(case when categoryid = 'B' then 1 else 0 end) > 0 or
sum(case when categoryid = 'C' then 1 else 0 end) > 0
) and
sum(case when categoryid in ('A', 'B', 'C') then 0 else 1 end) = 0
私がこの方法を好む理由は、非常に表現力があるからです。を に変更するor
とand
、3 つのカテゴリすべてを要求することになります。
select ADVERTISEMENTID
from t
group by ADVERTISEMENTID
having sum(case when categoryid = 'A' then 1 else 0 end) > 0 and
sum(case when categoryid = 'B' then 1 else 0 end) > 0 and
sum(case when categoryid = 'C' then 1 else 0 end) > 0
セットから少なくとも 2 つの一致が必要な場合は、次を追加できcount(distinct)
ます。
select ADVERTISEMENTID
from t
group by ADVERTISEMENTID
having (sum(case when categoryid = 'A' then 1 else 0 end) > 0 or
sum(case when categoryid = 'B' then 1 else 0 end) > 0 or
sum(case when categoryid = 'C' then 1 else 0 end) > 0
) and
count(distinct categoryid) >= 2
等々。