表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