4

我正在尝试一个简单的 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 是必需的,但所有左记录都返回匹配和不匹配的右记录,而我只想要左记录与不匹配的右记录。数据库引擎是 InnoDB。

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

LeftTable.ID, NullID
1, 1
2, Null

我只想要结果 2 即 NullID = Null

我尝试了以下 LEFT JOIN 并且是我一直在尝试的那种查询,但我收到错误“[Err] 1054 - Unknown column 'NullID' in 'where Clause'”。

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

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

4

2 回答 2

4

使用 NULL 值中所述

要测试NULL,请使用IS NULLandIS NOT NULL运算符,如下所示:

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

您不能使用算术比较运算符(例如=<<>)来测试NULL。为了自己演示这一点,请尝试以下查询:

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

因为任何算术比较的结果NULL也是NULL,所以您无法从此类比较中获得任何有意义的结果。

此外,如列别名问题中所述

WHERE标准 SQL 不允许在子句中引用列别名。施加此限制是因为在WHERE评估子句时,可能尚未确定列值。

因此,在您的情况下:

SELECT LeftTable.ID, RightTable.ID as NullID
FROM   LeftTable LEFT JOIN RightTable ON RightTable.ID = LeftTable.ID
WHERE  RightTable.ID IS NULL
于 2013-10-27T09:38:29.587 回答
1

你可以试试这个:

SELECT
LeftTable.ID,
RightTable.ID as NullID
FROM
LeftTable
LEFT JOIN RightTable ON RightTable.ID = LeftTable.ID
where RightTable.NullID IS NULL;
于 2013-10-27T09:39:17.823 回答