如何从子查询的行计数等于X的子查询返回记录?

时间:2019-01-08 23:41:41

标签: sql tsql

我有一个名为Groups的表,其结构如下...

+--------------+
| Id   GroupId |
+--------------+
| 1    3       |
| 2    3       |
| 3    2       |
| 1    2       |
| 2    2       |
| 3    2       |
+--------------+

我想返回Id = 1且另一个Id = 2的GroupId,所以结果应该是3。这是到目前为止我尝试过的事情...

SELECT GroupId FROM Groups G1
WHERE G1.Id = 1 and exists ( select 1
FROM Groups G2
WHERE G2.Id = 2
and G1.GroupId = G2.GroupId)

这很好,直到添加了两个ID都存在的组(组2)。然后,此操作失败,因为子查询返回的值超过1。

我已经考虑过使用HAVING COUNT(*)== 2来尝试让子查询返回仅包含2行计数的组,但是我不确定如何做到这一点,有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用group byhaving

select groupid
from groups
where id in (1, 2)
group by groupid
having count(*) = 2;

这假设行是唯一的。如果可以重复,请使用count(distinct id) = 2

如果您想要1和2且没有其他 id,则逻辑会稍微复杂一些:

select groupid
from groups
group by groupid
having sum(case when id = 1 then 1 else 0 end) > 0 and
       sum(case when id = 2 then 1 else 0 end) > 0 and
       count(*) = 2;