sql查询从重复项中查找缺少的值
我有一张这样的桌子:sql查询从重复项中查找缺少的值,sql,sql-server,Sql,Sql Server,我有一张这样的桌子: |__ID__|__Key__|__Value__| | 1 | AA | 2 | | 2 | AA | 2 | | 2 | BB | 2 | | 2 | CC | 2 | | 3 | BB | 2 | | 3 | AA | 2 | 我正在尝试构建一个查询来检查哪些ID缺少密钥BB 所以在上面的例子中,我会给出结果 |__ID__
|__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。您需要根据数据集中不存在的值筛选数据集,这通常最好使用
不存在的:
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
);
输出
正如我在评论中所说,我个人会使用HAVING
:
SELECT ID
FROM YourTable
GROUP BY ID
HAVING COUNT(CASE WHEN [Key] = 'BB' THEN 1 END) = 0;
对于那些认为这不起作用的人来说。你可以通过多种方式来实现。
其中之一是选择具有BB键的ID,这很容易,然后从完整的ID集中减去:
SELECT DISTINCT ID FROM Table1 WHERE ID NOT IN
(SELECT ID FROM Table1 WHERE [Key] = 'BB')
下面是SQLFiddle,显示了上述解决方案:
在这个问题中可以找到其他解决方法:
要搜索您需要的内容,请尝试以下问题:“如何选择不包含特定元素的组”,因为原则上,您希望按id对元素进行分组,并仅检索特定组,即使我们没有使用group by语句来解决它到目前为止您尝试了什么?您是否查看过不存在
,或具有条件聚合的
?(就个人而言,由于您只需要ID
,我会选择拥有
)我已经尝试了不存在和拥有,但我似乎无法让它工作。我知道我需要更多的实践来构建查询:D,你是对的。我只需要结果的ID。问题是有很多不同的键值。因此,我试图创建一个查询,它将相同的数字ID分组,并检查该数组中是否不存在键BB。@LasseSolberg抱歉,但您的评论对我来说没有意义。。。你的意思是说你正在筛选许多不同的键值,而不仅仅是BB
?@iamdave使用这个数据集值(1,'BB',2),(2,'BB',2),(4,'BB',2),(1,'AA',2),(2,'AA',2)尝试你的解决方案代码>,它将返回nothing@VasilyIvoyzha我的查询没有返回任何结果,因为所有id
值都有BB
键
?@LasseSolberg您确实尝试过我的查询吗?我保证这会返回正确的结果。效果很好!谢谢:)我没有投否决票,我试图投赞成票,但收到了这样一条信息:“感谢您的反馈!声誉低于15的人所投的票会被记录下来,但不会改变公开显示的帖子分数。”欢迎@Lasseolberg。我只希望我知道如何进一步“改进”这个问题以取悦选民。如果你不明白答案,请一定要问,但是,我希望这是一个非常不言自明的,:)@Larnu使用此数据集值(1,'BB',2),(2,'BB',2),(4,'BB',2),(1,'AA',2),(2,'AA',2)尝试你的解决方案代码>,它将从OP给出的描述中不返回任何内容,对于该数据集,它应该不返回任何内容。ID 1、2和4都有a键
,其值为BB
。OP甚至表示这回答了他们的问题。我认为您不理解OP的请求。@VasilyIvoyzha您的数据集没有ID3
。。。无法为不存在的值返回行。OP没有要求识别“缺失”的ID值,他们希望返回的ID没有键的值'BB'
SELECT DISTINCT ID FROM Table1 WHERE ID NOT IN
(SELECT ID FROM Table1 WHERE [Key] = 'BB')