2014-08-28 39 views
0

我有一個查詢以我不會期望的方式行事。當請求不在空集的項目時返回空集

我有兩個表,stagin_usersusers。在這兩個表中,我有一個名爲name的列。在users表中,name的EVERY值是NULL。在staging_users我有13行沒有NULL值。我試圖運行一個查詢,在那裏我得到了暫存表中名稱不在users表中的所有用戶。

我的書面查詢:

SELECT name FROM staging_users WHERE name NOT IN (SELECT name FROM users);

由於編寫查詢,我沒有得到任何結果回來。這種行爲的原因是什麼?

由於users表只具有NULL值,我知道我可以說WHERE name IS NOT NULL,我會得到相同的結果,但我想這個查詢針對表中的值,而這一切正好是NULL工作。

+0

可能重複的[MySQL的選擇x從WHERE NOT IN(SELECT X選自B) - 意外的結果](http://stackoverflow.com/questions/1001144/mysql-select-x-from -a-where-in-select-x-from-b-unexpected-result) – 2014-08-28 16:57:26

+1

NULL被看作是'unknown',這使得查詢排序無效。 – RST 2014-08-28 17:18:46

回答

3

docs

爲符合SQL標準,在返回NULL不僅如果在左側表達式爲NULL,而且如果不匹配,在列表中的一個發現列表中的表達式爲NULL。

而且

expr NOT IN (value,...)相同NOT (expr IN (value,...))

因此,你是SELECT荷蘭國際集團NULL值.. NOT IN返回NULL ..所以沒有行匹配。

你可以糾正像這樣:

SELECT name 
    FROM staging_users 
WHERE name IS NOT NULL 
    AND name NOT IN (
    SELECT name 
    FROM users 
    WHERE name IS NOT NULL 
     ); 

或者,相同的邏輯:

SELECT su.name 
    FROM staging_users su 
LEFT JOIN users u 
     ON u.name = su.name 
     AND su.name IS NOT NULL 
     AND u.name IS NOT NULL; 

作爲一個額外的說明,我會認真質疑的數據結構,允許用戶有NULL的名字..如果此更改,您的原始查詢將起作用。