2010-04-02 66 views
5

我花了一些時間,試圖爲什麼這個查詢不拉,結果我希望弄清楚:爲什麼「不存在」的SQL查詢工作,「不是」不

SELECT * FROM NGS WHERE ESPSSN NOT IN (SELECT SSN FROM CENSUS) 

最後我嘗試編寫查詢另一種方式和最終獲得了預期的效果:

SELECT * FROM NGS n WHERE NOT EXISTS (SELECT * FROM CENSUS WHERE SSN = n.ESPSSN) 

第一個查詢似乎更合適,更「正確」。我一直使用「in」和「not in」來進行類似的選擇,並且從來沒有遇到過,我知道

回答

11

如果你寫出來的語法糖,x not in (1,2,3)變爲:

x <> 1 AND x <> 2 AND x <> 3 

因此,如果ssn列包含空值,第一個查詢是等價的:

WHERE ESPSSN <> NULL AND ESPSSN <> ... 

的結果與NULL的比較是未知的,所以查詢不會返回任何東西。

+0

良好的通話!我剛查過,表中有一個空值。將查詢重寫爲SELECT * FROM NGS WHERE ESPSSN NOT IN(SELECT ISNULL(SSN,'')FROM CENSUS)給了我期望的值。我想知道我應該使用哪一個? – Josh 2010-04-02 17:47:25

+0

@Josh:我默認爲'not exists',因爲它不會受到'null'的困擾。但是,如果您有性能問題,那麼可以考慮這兩個選項的查詢計劃 – Andomar 2010-04-02 17:52:30

+0

@Josh,@Andomar:ISNULL將使任何可能在 – gbn 2010-04-02 18:21:23

2

正如Andomar表示,採用NOT IN

還要注意,使用NOT IN謂詞的查詢將利用NOT EXISTS可以使用子查詢內的索引始終執行嵌套全表掃描,而查詢時提防NULL值的,結果會更快。

+0

之前使用的索引無效。謝謝。 – Josh 2010-04-02 17:48:12