表1(ID,姓名)
表2(ID,姓名)如何从一个表中选择其他表中不存在的所有记录?
查询:
SELECT name
FROM table2
-- that are not in table1 already
表1(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
Q:这到底是怎么回事?
一个:从概念上讲,我们从table1
选择所有的行,每一行,我们试图找到table2
一排为name
列的值相同。如果没有这样的行,我们只需将结果的table2
部分留空即可。然后我们通过仅挑选匹配行不存在的结果中的那些行来约束我们的选择。最后,我们忽略了除name
列(我们确信存在的一个,从table1
)以外的结果中的所有字段。
虽然它可能不会在所有情况下是最高效的方法可能,它应该工作在基本上每个数据库引擎曾经试图实施ANSI 92 SQL
@ 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
非常感谢,对于大型数据集很适用 – sirus 2015-02-02 11:29:38
@Kris您能否描述一下这里发生了什么? – 2016-09-28 18:34:45
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种技术来实现这一点
“not in”语法也适用于SQLite。 – jftuga 2014-01-10 14:33:44
这对于大量数据来说非常慢。 – Lightbulb1 2014-09-02 16:29:48
是的,确实很慢 – sirus 2015-02-02 11:29:17
我没有足够的代表点投票第二个答案。但我不得不不同意最上面的答案。第二个答案:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
FAR在实践中效率更高。我不知道为什么,但我正在对800k +记录运行它,并且差异是巨大的,给出了上面第二个答案的优点。只要我的$ 0.02
在NOT IN查询中,只执行一次子查询,在EXISTS查询中,每行都执行子查询 – Carrick 2014-02-25 16:49:12
你真棒:)这样我就用25秒查询将左连接转换为0.1秒 – 2017-08-19 22:33:10
注意陷阱。如果Table1
中的字段Name
包含空值,则表示您有惊喜。 更好的是:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
COALESCE> ISNULL( ISNULL是一种无用的T-SQL语言,它不会比COALESCE更新或更好) – Kris 2017-06-16 11:53:38
您可以在Oracle中使用MSSQL EXCEPT
或MINUS
,他们按照相同:
这对我来说
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
这里的工作锐什么对我最有效。
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
这比我试过的其他方法快两倍多。
对于SQL Server和Informix支持哪些数据库 - TSQL。 – 2010-04-21 20:31:25