【发布时间】:2016-04-28 06:10:55
【问题描述】:
我正在尝试更直观地掌握 SQL 连接。就在昨天,我了解到如何将 RIGHT JOIN 重写为 LEFT JOIN(通过翻转表的顺序),这有助于我更好地理解这两个连接的工作方式。
但是,现在我想知道是否可以将 INNER JOIN 重写为带有 WHERE 条件的 LEFT JOIN——这意味着它们的逻辑可能是等价的(“逻辑”不是指执行计划,而是描述预期结果集的方式)。
喜欢:
SELECT * FROM HeaderTable
INNER JOIN DetailTable
ON HeaderTable.ID = DetailTable.ParentID
我会读作“向我显示表 HeaderTable 和 DetailTable 中在 HeaderTable.ID 中具有匹配值的所有记录和 DetailTable.ParentID 字段。”等同于:
SELECT * FROM HeaderTable
LEFT JOIN DetailTable
ON HeaderTable.ID = DetailTable.ParentID
WHERE HeaderTable.ID = DetailTable.ParentID
我会读为“向我显示表 HeaderTable 和 DetailTable 中的所有记录,其中 HeaderTable.ID 的值相同作为 DetailTable.ParentID 的值。"
这些会返回相同的结果集吗?我更多地询问逻辑是否相同,而不是一个比另一个更有效。
如果我可以问,请不要用任何维恩图来回答,因为这些似乎并不能准确地向我描述连接的逻辑。
【问题讨论】:
-
视觉表示怎么能帮不上忙?是的,在您的示例中它们是相同的,因为当您在 where 子句中添加谓词时,您只会返回在两个表中都匹配的那些行。
-
你也可以有“WHERE DetailTable.ParentID IS NOT NULL”,它会是一样的。
-
没有数据不重复。当第二个表中有多行与连接谓词匹配时,会发生什么情况,第一个表中的值出现在两行上,因为这是放在这些行中的唯一合乎逻辑的东西。在您真正理解之前,它有点令人困惑。
-
@SeanLange 说得有道理,但我不认为这与维恩图所显示的完全一样,IMO。并且“第一个表中的值出现在两行上”,这就是我所说的重复数据的意思——这很好而且有用,我只是不认为维恩特别传达了这种可能性。只是我的一个非常挑剔的意见,但仍然只是一个意见
-
现在您已经了解了它的工作原理,再次查看维恩图。如果你想出一个更好的描述连接的可视化工具,我当然会很感兴趣。
标签: sql-server join left-join inner-join