SQL获取所有ID,其中精确指定子ID,而不获取其他ID,其中不存在某些子ID

时间:2015-02-03 13:29:15

标签: sql sql-server

对不起这个标题,我不知道如何用一句话来描述我的问题。

我有这样的表:

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

什么都不返回。

我认为这应该是绝对简单的,但堆栈溢出......

感谢您的帮助!

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