我正在尝试一个简单的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;
希望这能解释我的问题。感谢。
答案 0 :(得分:4)
要测试
NULL
,请使用IS NULL
和IS 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;