在SQL中查找某些行值的公共行

时间:2017-06-16 10:32:08

标签: sql tsql

我有一个包含Ids和subId列的表。我有一个用户定义的数据类型和一个SubId列表。我希望所有那些在我的用户定义数据类型中都包含所有子ID的ID。例如: 该表是:

 ID     SubID     
 1        2     
 1        3
 1        4
 2        3
 2        4
 2        2
 3        3
 3        2

,数据类型为

 CREATE TYPE SubIds AS TABLE   
( SubId INT );  
GO  

有价值

SubID
  3
  4

我希望输出为

  ID
   1
   2

因为只有ID 1和2包含subIds 3& 4

注意:Id和Sub ID的组合如果有任何用途

,将始终是唯一的

2 个答案:

答案 0 :(得分:2)

我们假设@s是您的ids表:

select t.ID
from t 
Where t.SubId in (select SubId from @s)
group by t.Id
having count(*) = (select count(*) from @s);

这假设两个表没有重复项。如果存在重复项,您可以使用:

select t.ID
from t 
Where t.SubId in (select SubId from @s)
group by t.Id
having count(distinct t.SubId) = (select count(distinct s.SubId) from @s s);

答案 1 :(得分:1)

试试这种方式

select ID
from yourtable 
Where SubID in (3,4)
Group by ID 
having Count(distinct SubID)=2

另一种更灵活的方法

select ID
from yourtable 
Group by ID 
having sum(case when SubID = 3 then 1 else 0 end) >= 1
   and sum(case when SubID = 4 then 1 else 0 end) >= 1

如果您想从SubId's表格类型中提取SubIds,那么

SELECT ID
FROM   yourtable T
       JOIN (SELECT SubID,
                    Count(1) OVER() AS cnt
             FROM   SubIds) S
         ON T.SubID = S.SubID
GROUP  BY ID,Cnt
HAVING Count(DISTINCT T.SubID) = s.cnt