我有一个ChildProducts表,它有一个名为ItemID的列,它引用Products表中名为ItemID的列。
我需要能够快速列出ChildItem中产品中不存在的所有ItemID。
最有效的方法是什么?
答案 0 :(得分:3)
SELECT ItemID
FROM ChildItems
WHERE ItemID NOT IN (SELECT ItemID FROM Products)
由于它们都短路, NOT IN
或EXISTS
的运行速度会比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