Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql查询从重复项中查找缺少的值_Sql_Sql Server - Fatal编程技术网

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您的数据集没有ID
3
。。。无法为不存在的值返回行。OP没有要求识别“缺失”的ID值,他们希望返回的ID没有
键的值
'BB'
SELECT DISTINCT ID FROM Table1 WHERE ID NOT IN
(SELECT ID FROM Table1 WHERE [Key] = 'BB')