如何select一个表中不存在于另一个表中的所有logging?
table1(id,名字)
表2(id,名称)
查询:
SELECT name FROM table2 -- that are not in table1 already
SELECT t1.name FROM table1 t1 LEFT JOIN table2 t2 ON t2.name = t1.name WHERE t2.name IS NULL
问 :这里发生了什么?
答 :从概念上讲,我们selecttable1
所有行,对于每一行,我们试图在table2
findname
列中相同值的行。 如果没有这样的行,我们只是将结果的table2
部分留空。 然后我们通过只挑选匹配行不存在的结果中的那些行来约束我们的select。 最后,除了name
列(我们确信存在的那个,从table1
)之外,我们忽略了结果中的所有字段。
虽然它可能不是所有情况下可能的最高性能的方法,但它应该在基本上每个尝试实现ANSI 92 SQL的数据库引擎中工作
SELECT name FROM table2 WHERE name NOT IN (SELECT name FROM table1)
要么
SELECT name FROM table2 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.name = table2.name)
看到这个问题的3种技术来完成这一点
我没有足够的代表点来回答第二个答案。 但是我不得不不同意最上面的答案。 第二个答案:
SELECT name FROM table2 WHERE name NOT IN (SELECT name FROM table1)
FAR是否在实践中更有效率? 我不知道为什么,但我正在对800k +的logging运行它,差异是巨大的,给上面第二个答案的好处。 只是我的$ 0.02
这是纯粹的理论,你可以用minus
操作来实现。
select id, name from table1 minus select id, name from table2
注意陷阱。 如果Table1
的字段Name
包含Null,那么您将遇到意外。 更好的是:
SELECT name FROM table2 WHERE name NOT IN (SELECT ISNULL(name ,'') FROM table1)
你可以在oracle中使用mssql或者MINUS
中的EXCEPT
,它们是相同的:
这是最适合我的。
SELECT * FROM @T1 EXCEPT SELECT a.* FROM @T1 a JOIN @T2 b ON a.ID = b.ID
这是我尝试过的其他方法的两倍多。
这对我来说很重要
SELECT * FROM [dbo].[table1] t1 LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID] WHERE t2.[t2_ID] IS NULL