查找与值匹配但与另一个不匹配的行

时间:2020-08-15 04:36:22

标签: sql sql-server tsql

在发布此消息之前,我已经在板上进行了搜索,但是找不到涵盖相同场景的任何内容,尽管我认为它被埋在我看不见的地方...

我正在学习SQL,并尝试建立一个查询,该查询返回列 IndexNr IndexNr 行包含 ID = x IndexNr 不包含任何具有 ID = y

我不查找任何特定的 IndexNr ...我希望所有具有 ID = x 但返回相同的 IndexNr 的人如果 ID = x 的匹配项在 Pos 列的某一行中也具有 ID = y ,则不能视为匹配项...这有道理吗?

IndexNr     Pos    ID
----------- ------ -----------
100001      0      -30140
100001      1      -28877
100001      2      -31659
100001      3      -28282
100003      0      -30262
100003      1      -30261
100003      2      -30260

所以我尝试了这个,但是当然我有限的SQL技能使我无法看到为达到此结果而缺少的其他子句...

SELECT [ToolNr] FROM [WTData].[dbo].[ToolParts] 
WHERE PartID = -30140 AND PartID <> -28877
ORDER BY [ToolNr]

从上面的查询中,不应将 IndexNr 100001 作为匹配项返回...

谢谢!

1 个答案:

答案 0 :(得分:3)

如果我理解正确,您可能会寻找NOT EXISTS和相关的子查询。

SELECT DISTINCT
       t1.indexnr
       FROM elbat t1
       WHERE t1.id = <your x>
             AND NOT EXISTS (SELECT *
                                    FROM elbat t2
                                    WHERE t2.indexnr = t1.indexnr
                                          AND t2.id = <your y>);

如果(indexnr, id)是唯一的,则不需要DISTINCT

替代方法可以是聚合。假设您的 x <您的 y

SELECT indexnr
       FROM elbat
       WHERE id IN (<your x>, <your y>)
       GROUP BY indexnr
       HAVING max(id) = min(id)
              AND max(id) = <your x>;

它首先仅获取id是您的 x 或您的 y 的记录。然后将它们按indexnr分组。现在,对于indexnr,如果先前过滤的所有行在id中仅包含 y 或仅包含 x ,则max(id)必须等于min(id)。由于我们只需要 x ,因此我们可以检查max(id)(或min(id))是否为 x