使用SQL Server 2005查找不属于2个表的值

时间:2011-10-12 17:15:45

标签: sql sql-server

我有一个ChildProducts表,它有一个名为ItemID的列,它引用Products表中名为ItemID的列。

我需要能够快速列出ChildItem中产品中不存在的所有ItemID。

最有效的方法是什么?

5 个答案:

答案 0 :(得分:3)

SELECT ItemID
FROM ChildItems
WHERE ItemID NOT IN (SELECT ItemID FROM Products)
由于它们都短路,

NOT INEXISTS的运行速度会比JOIN快。

答案 1 :(得分:1)

select c.ItemID 
from ChildProducts c left outer join Products p on c.ItemID = p.ItemID 
where p.ItemID IS NULL

编辑:JNK的回答是最好的选择,请参阅下文。

答案 2 :(得分:1)

不存在条款将完成工作:

    SELECT  *
    FROM    ChildItems c
    WHERE   NOT EXISTS (SELECT 'x' FROM Products p WHERE p.ItemID = C.ItemID)

抱歉 - 响应时在哈希中发生语法错误。谢谢@JNK。

答案 3 :(得分:0)

尝试这样的事情:

SELECT  *
FROM    ChildItems c
WHERE   c.ItemID NOT IN(SELECT p.ItemID FROM Products p)

如果您要删除孤立记录,可以执行以下操作:

DELETE FROM ChildItems c
WHERE  c.ItemID NOT IN (SELECT p.ItemID FROM Products p)

以下是您可以找到孤立记录的另一种方法:

SELECT  *
FROM    ChildItems c
        LEFT OUTER JOIN Products p
           ON c.ItemID = p.ItemID
WHERE    p.ItemID IS NULL

修改

假设您在删除孤立记录后想要消除此问题,我建议在ChildItems表中添加外键,并在删除记录时使用级联删除从{{1表格。

答案 4 :(得分:0)

您还可以使用经常被遗忘的EXCEPT运算符来执行此反半连接。

SELECT ItemID
FROM ChildItems
EXCEPT
SELECT ItemID 
FROM Products