這就是所謂的集內集問題。我想找到任何類別的比賽最好的辦法是採取下列措施:
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
是說任何這些必須是真實的。
對於一個子集的關係,我增加一個條款來算非匹配:
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
,那麼我們要求所有三類:
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
如果我們想從該組至少兩場比賽,我們可以添加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
而且等等。
非常感謝您的詳細回覆JW!實際上,我正在尋找更簡單的方法,可以將其移植到JPQL(Java Persitence API)中。你能不能簡單描述你暗示的其他可能的解決方案? – balteo
@balteo其他解決方案正在使用'EXISTS','JOIN'。 –
我可以知道我的答案中缺少什麼嗎?我的意思是沒有錯,但不接受它,但也許我需要一些解釋,所以我可以改善我的答案。 –