2010-04-21 53 views

回答

497
SELECT t1.name 
FROM table1 t1 
LEFT JOIN table2 t2 ON t2.name = t1.name 
WHERE t2.name IS NULL 

Q:这到底是怎么回事?

一个:从概念上讲,我们从table1选择所有的行,每一行,我们试图找到table2一排为name列的值相同。如果没有这样的行,我们只需将结果的table2部分留空即可。然后我们通过仅挑选匹配行不存在的结果中的那些行来约束我们的选择。最后,我们忽略了除name列(我们确信存在的一个,从table1)以外的结果中的所有字段。

虽然它可能不会在所有情况下是最高效的方法可能,它应该工作在基本上每个数据库引擎曾经试图实施ANSI 92 SQL

+14

@ z-boss:这也是SQL Server上性能最低的:http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql -server/ – 2010-04-21 20:32:07

+0

非常感谢,对于大型数据集很适用 – sirus 2015-02-02 11:29:38

+0

@Kris您能否描述一下这里发生了什么? – 2016-09-28 18:34:45

158
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) 

this question为3种技术来实现这一点

+4

“not in”语法也适用于SQLite。 – jftuga 2014-01-10 14:33:44

+14

这对于大量数据来说非常慢。 – Lightbulb1 2014-09-02 16:29:48

+0

是的,确实很慢 – sirus 2015-02-02 11:29:17

25

这是纯粹的理论,你可以用minus o peration。

select id, name from table1 
minus 
select id, name from table2 
+0

你认为这比左连接更有效吗? – uhs 2014-08-21 17:15:11

+0

应该是。减号命令专门用于这种确切的情况。当然,对任何特定数据集进行判断的唯一方法是尝试两种方式,并查看哪些数据更快。 – Winter 2014-09-05 02:45:26

+5

在T-SQL中,集合运算符是“except”。这对我来说非常方便,并没有造成任何放缓。 – 2016-04-19 18:49:31

53

我没有足够的代表点投票第二个答案。但我不得不不同意最上面的答案。第二个答案:

SELECT name 
FROM table2 
WHERE name NOT IN 
    (SELECT name 
    FROM table1) 

FAR在实践中效率更高。我不知道为什么,但我正在对800k +记录运行它,并且差异是巨大的,给出了上面第二个答案的优点。只要我的$ 0.02

+17

在NOT IN查询中,只执行一次子查询,在EXISTS查询中,每行都执行子查询 – Carrick 2014-02-25 16:49:12

+0

你真棒:)这样我就用25秒查询将左连接转换为0.1秒 – 2017-08-19 22:33:10

13

注意陷阱。如果Table1中的字段Name包含空值,则表示您有惊喜。 更好的是:

SELECT name 
FROM table2 
WHERE name NOT IN 
    (SELECT ISNULL(name ,'') 
    FROM table1) 
+0

COALESCE> ISNULL( ISNULL是一种无用的T-SQL语言,它不会比COALESCE更新或更好) – Kris 2017-06-16 11:53:38

4

这对我来说

SELECT * 
FROM [dbo].[table1] t1 
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID] 
WHERE t2.[t2_ID] IS NULL 
6

这里的工作锐什么对我最有效。

SELECT * 
FROM @T1 
EXCEPT 
SELECT a.* 
FROM @T1 a 
JOIN @T2 b ON a.ID = b.ID 

这比我试过的其他方法快两倍多。

相关问题