2013-10-27 102 views
4

我正在嘗試一個簡單的LEFT JOIN查詢,我想從左表中找到記錄,其中 在RIGHT表中沒有匹配。MySQL LEFT OUTER JOIN不過濾記錄

SELECT 
LeftTable.ID, 
RightTable.ID as NullID 
FROM 
LeftTable 
LEFT OUTER JOIN RightTable ON RightTable.ID = LeftTable.ID 

那麼,如何選擇結果只包含NullID爲NULL的記錄的行呢? 我認爲左外部連接是需要的,但是所有左邊的記錄都會返回匹配和不匹配的正確記錄,我只希望留下具有不匹配正確記錄的記錄。數據庫引擎是InnoDB。

例如,查詢返回以下:

LeftTable.ID, NullID 
1, 1 
2, Null 

我只想導致2即其中NULLID = NULL

我嘗試以下LEFT JOIN,是我一直查詢的種類嘗試但我得到錯誤 「[錯誤] 1054 - 在'where子句'」中的未知列'NullID'「。

SELECT 
LeftTable.ID, 
RightTable.ID as NullID 
FROM 
LeftTable 
LEFT JOIN RightTable ON RightTable.ID = LeftTable.ID 
where NullID = Null; 

希望這可以解釋我的問題。謝謝。

回答

4

由於Working with NULL Values下記載:

爲了測試NULL,使用IS NULLIS NOT NULL運營商,如下所示:

 
mysql> SELECT 1 IS NULL, 1 IS NOT NULL; 
+-----------+---------------+ 
| 1 IS NULL | 1 IS NOT NULL | 
+-----------+---------------+ 
|   0 |    1 | 
+-----------+---------------+ 

不能使用算術比較符如=<,或<>來測試NULL。爲了證明自己這一點,請嘗試以下查詢:

 
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL; 
+----------+-----------+----------+----------+ 
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL | 
+----------+-----------+----------+----------+ 
|  NULL |  NULL |  NULL |  NULL | 
+----------+-----------+----------+----------+ 

因爲與NULL任何算術比較的結果也NULL,你不能從這種比較獲得任何有意義的結果。

此外,Problems with Column Aliases下的記載:

標準SQL不允許在WHERE子句中的列別名引用。施加此限制是因爲在評估WHERE子句時,列值可能尚未確定。

因此,你的情況:

SELECT LeftTable.ID, RightTable.ID as NullID 
FROM LeftTable LEFT JOIN RightTable ON RightTable.ID = LeftTable.ID 
WHERE RightTable.ID IS NULL 
1

你可以試試這個:

SELECT 
LeftTable.ID, 
RightTable.ID as NullID 
FROM 
LeftTable 
LEFT JOIN RightTable ON RightTable.ID = LeftTable.ID 
where RightTable.NullID IS NULL;