MySQL LEFT OUTER JOIN不过滤记录

时间:2013-10-27 09:36:33

标签: mysql sql

我正在尝试一个简单的LEFT JOIN查询,我想要LEFT表中的记录 在RIGHT表中没有匹配项。

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

那么,如何选择结果只包含NullID为NULL的记录的行? 我认为LEFT OUTER JOIN是必需的,但是所有Left记录都返回了匹配和不匹配的正确记录,我只希望左记录具有不匹配的正确记录。 数据库引擎是InnoDB。

例如,查询返回以下内容:

LeftTable.ID, NullID
1, 1
2, Null

我只想要结果2,即NullID = Null

我尝试了以下LEFT JOIN并且是我一直在尝试的那种查询,但是我收到错误 “[Err] 1054 - 'where子句'中的未知列'NullID'”。

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

希望这能解释我的问题。感谢。

2 个答案:

答案 0 :(得分: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 :(得分:1)

你可以试试这个:

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