在发布此消息之前,我已经在板上进行了搜索,但是找不到涵盖相同场景的任何内容,尽管我认为它被埋在我看不见的地方...
我正在学习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 作为匹配项返回...
谢谢!
答案 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 。