繁体   English   中英

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

[英]find values that do not belong in 2 tables using SQL Server 2005

我有一个ChildProducts表,该表具有一个称为ItemID的列,该列引用了Products表中一个称为ItemID的列。

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

最有效的方法是什么?

SELECT ItemID
FROM ChildItems
WHERE ItemID NOT IN (SELECT ItemID FROM Products)

因为它们都短路,所以NOT INEXISTS运行速度比JOIN快。

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

编辑:虽然JNK的答案将是最好的选择,请在下面查看。

不存在子句可以完成工作:

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

抱歉-响应时急于语法错误。 谢谢@JNK。

尝试这样的事情:

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表添加外键,并在从Products表中删除记录时使用级联删除。

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

SELECT ItemID
FROM ChildItems
EXCEPT
SELECT ItemID 
FROM Products

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM