在数据库向导的领域中,使用左连接执行复杂的数据检索是一种常见的做法。然而,有时,左连接的行为并不完全符合预期。
想象一下以下查询:
SELECT a.foo, b.bar, c.foobar FROM tableOne AS a INNER JOIN tableTwo AS b ON a.pk = b.fk LEFT JOIN tableThree AS c ON b.pk = c.fk WHERE a.foo = 'something' AND c.foobar = 'somethingelse';
有趣的是,当 c.foobar 条件放置在 WHERE 子句中时,上面,所谓的左连接似乎转变为内连接。仅当满足 a.foo 和 c.foobar 条件时才返回结果。
为什么会变态?关键在于WHERE子句。当在 WHERE 子句中指定左连接右侧的值(右侧指的是 ON 子句右侧的表)时,所有 NULL 值都将被丢弃,从而有效地将左连接简化为内连接。简单来说,如果 tableThree 中不存在 c.foobar,则查询不会返回任何行。
要绕过此困境,有两个选项:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
在这些解决方案之间进行选择取决于具体情况查询的要求。然而,了解 WHERE 子句存在时左连接的基本行为对于掌握数据检索技术至关重要。
以上是为什么在 WHERE 子句中过滤右表的列时,我的左联接表现得像内联接?的详细内容。更多信息请关注PHP中文网其他相关文章!