SQL Server SQL内连接与带WHERE的左连接

9nvpjoqh  于 2023-02-15  发布在  其他
关注(0)|答案(3)|浏览(238)

我试图更直观地掌握SQL连接。例如,学习如何将右连接重写为左连接(通过翻转表的顺序)帮助我更好地理解这两个连接的工作方式。
但是,现在我想知道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 * 的值相同"。

    • 它们会返回相同的结果集吗?我更关心的是逻辑是否相同,而不是一个比另一个更有效。**

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

8wtpewkr

8wtpewkr1#

是的,它们将返回相同的结果。不带where子句的左联接将读作 *show me the all records from the header table and the related item from the details table,或者对于没有匹配项的详细信息为null *。
添加一个与id相关的where子句可以有效地将左连接转换为内连接,因为它消除了不匹配的行,这些行在细节部分显示为空。
在某些数据库(如MS SQL Server)中,左联接将在查询执行计划中显示为内联接。
虽然你说你不想要维恩图,但我还是忍不住要让你参考this question and its answers,尽管它们充满了维恩图(在我看来非常有帮助)。

qjp7pelc

qjp7pelc2#

是的,它们将返回相同的结果。
但是你可以简单地写

SELECT * 
FROM HeaderTable, DetailTable
WHERE HeaderTable.ID = DetailTable.ParentID

这也会返回相同的结果。2这是在join子句引入之前使用的旧语法。

sauutmhj

sauutmhj3#

在左连接中,如果在where中引用左,则对左求反并将其转换为常规连接

相关问题