对不起这个标题,我不知道如何用一句话来描述我的问题。
我有这样的表:
event | thema
-------------
1 1
1 2
2 1
2 2
2 3
3 1
3 2
3 3
3 4
4 1
4 2
4 3
我想要的是事件ID,其中thema是exaclty 1,2和3,而不是事件ID,它只有1和2或1,2,3和4。
SELECT event WHERE thema=1 OR thema=2 OR thema=3
全部归还
SELECT event WHERE thema=1 AND thema=2 AND thema=3
什么都不返回。
我认为这应该是绝对简单的,但堆栈溢出......
感谢您的帮助!
答案 0 :(得分:2)
event
分组,只接受至少有thema
1和2和3而不是其他任何
SELECT event
from your_table
group by event
having sum(case when thema = 1 then 1 else 0 end) > 0
and sum(case when thema = 2 then 1 else 0 end) > 0
and sum(case when thema = 3 then 1 else 0 end) > 0
and sum(case when thema not in (1,2,3) then 1 else 0 end) = 0
答案 1 :(得分:1)
这种类型的查询是" set-within-sets"查询(您正在为每个事件寻找" thema"的集合)。最常用的方法是使用having
子句进行聚合。这可能是使用标准SQL编写查询的最短方式:
select event
from table t
group by event
having count(distinct (case when thema in (1, 2, 3) then thema end)) = 3;
答案 2 :(得分:0)
,或者
首先创建表@themas
(取决于供应商,使其成为临时表或简单的表值变量),其中包含用户指定的thema值列表,然后
Select event from your_table y
Where not exists
(Select * From @Themas t
where Not Exists
(Select * From your_table
where event = y.event
and thema = t.thema))
and not exists (Select * From your_table
where event = t.event
and thema not in
(Select thema From @Themas ))