【问题标题】:sql query find missing value from duplicatessql查询从重复项中查找缺失值
【发布时间】:2019-06-07 09:05:52
【问题描述】:

我有一张这样的桌子:

|__ID__|__Key__|__Value__|
|  1   |  AA   |   2     |
|  2   |  AA   |   2     |
|  2   |  BB   |   2     |
|  2   |  CC   |   2     |
|  3   |  BB   |   2     |
|  3   |  AA   |   2     |

我正在尝试构建一个查询来检查哪些 ID 缺少 Key BB。

所以在上面的例子中我会得到结果

|__ID__|
|  1   |

我曾尝试在 StackOVerflow 和其他网站上搜索类似的问题,但结果总是列出所有没有键 BB 的 ID 行。在上面的例子中,我会得到 1,2,2,3。

【问题讨论】:

  • 到目前为止你尝试过什么?您是否看过 NOT EXISTSHAVING 的条件聚合? (就个人而言,因为你只需要ID,我会选择HAVING。)
  • 我已经尝试过 NOT EXISTS 和 HAVING,但我似乎无法让它工作。我知道我需要更多练习来构建查询:D 你是对的。我只需要结果的 ID。

标签: sql sql-server


【解决方案1】:

您需要根据数据集中的值过滤数据集,这通常最好使用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 |
+----+

【讨论】:

  • 这样做的问题是有很多不同的Key值。所以我尝试创建的是一个查询,它将相同的数字 ID 分组并检查该数组中是否不存在 Key BB。
  • @LasseSolberg 抱歉,您的评论对我来说没有意义...您的意思是您要过滤许多不同的键值,而不仅仅是 BB
  • @iamdave 使用此数据集 values (1,'BB',2),(2,'BB',2),(4,'BB',2),(1,'AA',2), (2,'AA',2); 尝试您的解决方案,它不会返回任何内容
  • @VasilyIvoyzha 我的查询没有返回任何结果,因为所有id 值都有一个BB key?
  • @LasseSolberg 你真的尝试过我的查询吗?我保证这将返回正确的结果。
【解决方案2】:

您可以通过多种方式实现这一目标。 其中之一是选择具有键 BB 的 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 对元素进行分组并仅检索某些组,即使我们没有t 使用 GROUP BY 语句来解决它

【讨论】:

    【解决方案3】:

    就像我在 cmets 中说的,我个人会使用HAVING

    SELECT ID
    FROM YourTable 
    GROUP BY ID
    HAVING COUNT(CASE WHEN [Key] = 'BB' THEN 1 END) = 0;
    

    DB<>fiddle 代表认为这不起作用的人。

    【讨论】:

    • 像魅力一样工作!谢谢 :) 我没有投反对票,我尝试投赞成票,但收到此消息“感谢您的反馈!声望低于 15 人的投票将被记录,但不要更改公开显示的帖子分数。”
    • 不客气@LasseSolberg。我只是希望我知道如何进一步“改进”这个问题以取悦反对者。如果您不理解答案,请尽管问,但是,我希望这个答案是不言自明的,:)
    • @Larnu 尝试使用此数据集 values (1,'BB',2),(2,'BB',2),(4,'BB',2),(1,'AA',2), (2,'AA',2); 的解决方案,它不会返回任何内容
    • 根据 OP 给出的描述,对于该数据集,它应该什么都不返回。 ID 1、2 和 4 all 具有 key 和值 BB。 OP甚至表示这回答了他们的问题。我认为您没有理解 OP 的要求。
    • @VasilyIvoyzha 您的数据集没有 ID 3... 无法为不存在的值返回行。 OP 没有要求识别“丢失”的 ID 值,他们希望为 key 返回不具有值 'BB' 的 ID
    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多