2012-08-15 71 views
2

我有兩個表: teacher_lm和老師。 這些表格既包含「teacher_email」列查詢獲得記錄在一個表中,但不在另一個

我需要的是獲取teacher_lm中存在的電子郵件,但不包含在teacher中。

我有2種不同的方法來解決這個問題,但我不明白爲什麼其中一個沒有給出任何結果,另一個返回很多行。

第一位:842行

SELECT DISTINCT lm.teacher_email 
FROM  teacher_lm as lm 
WHERE  NOT EXISTS (SELECT * FROM teacher as lt 
     WHERE lt.teacher_email = lm.teacher_email   
    ) 

第二個:沒有結果

SELECT DISTINCT lm.teacher_email FROM 
teacher_lm AS lm 
WHERE lm.teacher_email NOT IN 
(SELECT lt.teacher_email FROM 
teacher AS lt) 

你能告訴我什麼,我做錯了什麼,什麼是做到這一點的最好方法是什麼?

謝謝。

回答

6

「in」子查詢中可能有一個NULL。

試試這個:

SELECT DISTINCT lm.teacher_email 
FROM teacher_lm AS lm 
WHERE lm.teacher_email NOT IN (SELECT coalesce(lt.teacher_email, '') 
           FROM teacher AS lt) 

順便說一句,我認爲第一個版本是推薦使用的MySQL優化的原因的版本。

+0

謝謝!你是對的:)現在它給了相同數量的結果。 IN子查詢需要花費數年的時間才能完成,因此我會選擇那個。再次感謝:) – Vika 2012-08-15 17:57:30

+0

@Vika。 。 。以防萬一您使用另一個數據庫,EXISTS比IN更好的特性是針對mysql的。可能在其他數據庫中也可能不是這樣,但其他數據庫引擎可以優化IN並且不會更好。 – 2012-08-15 18:55:38

1

您的第一個查詢正在處理整行的存在。

第二個查詢可能會返回空值。我不相信NOT IN子句在空值的情況下工作良好。

戈登的答案通過用空字符串替換空值來糾正此問題。

相關問題