2010-04-21 49 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 

這比我試過的其他方法快兩倍多。

相關問題