我有一个这样的表:
|__ID__|__Key__|__Value__|
| 1 | AA | 2 |
| 2 | AA | 2 |
| 2 | BB | 2 |
| 2 | CC | 2 |
| 3 | BB | 2 |
| 3 | AA | 2 |
我正在尝试建立一个查询,以检查哪些ID缺少密钥BB。
因此,在上面的示例中,我会用结果
|__ID__|
| 1 |
我已经尝试在StackOVerflow和其他站点上搜索类似的问题,但是我总是最终得到列出所有没有键BB的ID行的结果。在上面的示例中,我将得到1,2,2,3。
答案 0 :(得分:2)
您需要根据数据集中没有的值过滤数据集,通常最好使用not exists
:
declare @t table (id int,keys varchar(50),value int);
insert into @t values (1,'AA',2),(2,'AA',2),(2,'BB',2),(3,'AA',2),(3,'BB',2);
select t1.id
from @t as t1
where not exists(select id
from @t as t2
where keys = 'BB'
and t1.id = t2.id
);
+----+
| id |
+----+
| 1 |
+----+
答案 1 :(得分:1)
就像我在评论中说的那样,我将亲自使用HAVING
:
SELECT ID
FROM YourTable
GROUP BY ID
HAVING COUNT(CASE WHEN [Key] = 'BB' THEN 1 END) = 0;
DB<>fiddle(针对认为这不起作用的人)。
答案 2 :(得分:1)
您可以通过多种方式来实现。 其中之一是选择具有密钥BB的ID,该ID很简单,然后从完整的ID中减去:
SELECT DISTINCT ID FROM Table1 WHERE ID NOT IN
(SELECT ID FROM Table1 WHERE [Key] = 'BB')
下面是SQLFiddle显示上面的解决方案:http://www.sqlfiddle.com/#!18/47db9/6
其他解决方法可以在以下SO问题中找到:SQL: How do you select only groups that do not contain a certain value?
要搜索需要尝试的内容,例如:“如何选择不包含某个元素的组”,因为原则上您希望按ID对元素进行分组,即使我们没有,也只能检索某些组。不要使用GROUP BY语句来解决它