我需要从OldTable中找到NewTable中不存在的所有id 为什么这个查询不会找到id?
SELECT old_id FROM OldTable WHERE old_id NOT IN (
SELECT id FROM NewTable)
他们自己回来了
--Returns the id 18571
SELECT old_id FROM OldTable WHERE old_id = 18571
--Returns nothing
SELECT id FROM NewTable WHERE id = 18571
我错过了一些明显的东西吗?
两列都是int
类型和主键。
已解决
id列中有null,我只是无知= /
这些作品:
SELECT old_id FROM OldTable EXCEPT SELECT id FROM NewTable
SELECT * FROM old_table ot WHERE NOT EXISTS (
SELECT * FROM new_table nt WHERE nt.id = ot.old_id)
这些不起作用:
SELECT old_id FROM OldTable LEFT JOIN NewTable ON old_id = id WHERE id IS NULL
SELECT old_id FROM OldTable WHERE old_id NOT IN (
SELECT id FROM NewTable)
答案 0 :(得分:2)
SELECT * FROM old_table ot
WHERE NOT EXISTS (
SELECT * FROM new_table nt
WHERE nt.new_key = ot.old_key
);
答案 1 :(得分:2)
差异可归因于空值的存在。
考虑这两个简化的查询,注意两者的谓词是NULL = 1
,其评估为UNKNOWN,分别由NOT EXISTS
和NOT IN
处理:
SELECT *
FROM OldTable
WHERE NULL NOT IN (SELECT 1 FROM OldTable);
SELECT *
FROM OldTable
WHERE NOT EXISTS (SELECT * FROM OldTable WHERE NULL = 1);
第一个没有返回任何行,因为NOT IN (subquery)
被评估为FALSE。
第一个返回所有行,因为NOT EXISTS (subquery)
被评估为TRUE。
结论:避免空值。
答案 2 :(得分:1)
我不知道为什么你的查询没有给你想要的结果,但我知道使用NOT IN
效率不高。你最好使用连接:
SELECT old_id
FROM OldTable
LEFT JOIN NewTable
ON old_id = id
WHERE id IS NULL
答案 3 :(得分:0)
SELECT old_id FROM OLDTable WHERE id not in (SELECT id from NewTable);
您在第一个查询中的where条件中使用old_id,并且您在第二个查询中使用id
答案 4 :(得分:0)
select oldtable.id as orginal, newtable.id as new
from oldtable
left outer join newtable
on oldtable.id =newtable.id
where new is null
AFAIK(我不是专家 - 检查我的代表;-)左外连接是一个很好的技术..它将可能执行一个不在,并且不需要一个子选择
@onedaywhen友好地指出,情况并非总是如此。在SQL Server中,EXISTS()可以更高效。