sql查询从重复项中找到丢失的值

时间:2019-06-07 09:05:52

标签: 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__|
|  1   |

我已经尝试在StackOVerflow和其他站点上搜索类似的问题,但是我总是最终得到列出所有没有键BB的ID行的结果。在上面的示例中,我将得到1,2,2,3。

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语句来解决它