首页 > 数据库 > mysql教程 > 为什么在 WHERE 子句中过滤右表的列时,我的左联接表现得像内联接?

为什么在 WHERE 子句中过滤右表的列时,我的左联接表现得像内联接?

DDD
发布: 2024-12-30 03:08:10
原创
795 人浏览过

Why Does My Left Join Act Like an Inner Join When Filtering on the Right Table's Column in the WHERE Clause?

左连接难题:当它变成内连接时的神奇时刻

在数据库向导的领域中,使用左连接执行复杂的数据检索是一种常见的做法。然而,有时,左连接的行为并不完全符合预期。

想象一下以下查询:

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,则查询不会返回任何行。

要绕过此困境,有两个选项:

  1. 修改 WHERE 子句以考虑有效值和 NULL 值c.foobar:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
登录后复制
  1. 将 c.foobar 条件移至连接谓词中:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
登录后复制

在这些解决方案之间进行选择取决于具体情况查询的要求。然而,了解 WHERE 子句存在时左连接的基本行为对于掌握数据检索技术至关重要。

以上是为什么在 WHERE 子句中过滤右表的列时,我的左联接表现得像内联接?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板