SQL INNER JOIN vs LEFT JOIN with a WHERE

elm*_*007 6 sql-server join inner-join left-join

我试图更直观地掌握 SQL 连接。就在昨天,我了解了如何将 RIGHT JOIN 重写为 LEFT JOIN(通过翻转表格的顺序),这帮助我更好地理解了这两个连接的工作方式。

但是,现在我想知道是否可以将 INNER JOIN 重写为带有 WHERE 条件的 LEFT JOIN——这意味着它们的逻辑可能是等效的(“逻辑”不是指执行计划,而是将描述预期的结果集)。

喜欢:

SELECT * FROM HeaderTable
INNER JOIN DetailTable 
ON HeaderTable.ID = DetailTable.ParentID
Run Code Online (Sandbox Code Playgroud)

我将其读作“向我显示HeaderTableDetailTable表中在HeaderTable.IDDetailTable.ParentID字段中具有匹配值的所有记录。” 与以下相同:

SELECT * FROM HeaderTable
LEFT JOIN DetailTable 
ON    HeaderTable.ID = DetailTable.ParentID
WHERE HeaderTable.ID = DetailTable.ParentID
Run Code Online (Sandbox Code Playgroud)

这也是我读作“让我看看表中的所有记录HeaderTableDetailTable其中的价值HeaderTable.ID相同的值DetailTable.ParentID。”

这些会返回相同的结果集吗?我更多地询问逻辑是否相同,而不是一个比另一个更有效。

如果我可能会问,请不要用任何维恩图来回答,因为这些似乎并没有准确地描述连接的逻辑。

jpw*_*jpw 6

是的,它们将返回相同的结果。没有 where 子句的左连接将读取为显示标题表中的所有记录和详细信息表中的相关项目,或者为没有匹配项的详细信息显示 null

添加一个与 id 相关的 where 子句,通过消除在细节部分显示为 null 的不匹配行,有效地将左连接转换为内连接。

在某些数据库中,例如 MS SQL Server,左联接将在查询执行计划中显示为内部联接。

虽然你说你不想要维恩图,但我还是忍不住向你推荐这个问题及其答案,即使它们充满了(在我看来非常有用的)维恩图。