如何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所有行,对于每一行,我们试图在table2findname列中相同值的行。 如果没有这样的行,我们只是将结果的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 ,它们是相同的:

http://blog.sqlauthority.com/2008/08/07/sql-server-except-clause-in-sql-server-is-similar-to-minus-clause-in-oracle/

这是最适合我的。

 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