我正在尝试以下查询,其中 TABLE B 为空且 TABLEA 中有记录
--This query fetched no records
SELECT TABLEA.COLA,TABLEA.COLB FROM TABLEA
LEFT JOIN TABLEB
ON TABLEA.ID=TABLEB.ID
WHERE TABLEB.COL1<>'XYZ'
--This query fetched records .
SELECT COL1 FROM
(
SELECT TABLEA.COLA,TABLEA.COLB FROM TABLEA
LEFT JOIN TABLEB
ON TABLEA.ID=TABLEB.ID
)A WHERE COL1 <>'XYZ'
你能帮我解释为什么第一个查询没有返回任何记录,尽管它们看起来相同。我对第一个查询的理解是“我做了一个左连接,所以如果 tableb 中不存在记录,则应将其替换为 NULL 值。由于 NULL <>'xyz' 所有记录都应正确获取。
最佳答案
在 OUTER JOIN 的 OUTER 连接表上放置 WHERE 条件可有效将该连接呈现为 INNER JOIN。因此,如果外表中没有满足条件的行,则不会返回任何行。
解决方案是在连接本身中包含任何此类条件。在上面的示例中,这就像将 WHERE 更改为 AND 一样简单。
必须放在 WHERE 子句中的一个条件是对 NULL 的测试,即所谓的排除连接 - 即当你真正想要返回逆集时。
关于mysql - 左连接条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26418552/