【发布时间】:2014-04-14 19:21:27
【问题描述】:
假设表TableATableBTableC和TableD:
是以下查询:
TableA INNER JOIN TableB LEFT JOIN TableC LEFT JOIN TableD
(全部连接到一个 id 列)相当于:
TableA INNER JOIN TableB
INNER JOIN TableC
LEFT JOIN TableD
UNION
TableA INNER JOIN TableB
LEFT JOIN TableC ON TableB.c_id IS NULL
LEFT JOIN TableD
?
注意:
或者代替 union 只是做
TableA INNER JOIN TableB
INNER JOIN TableC
LEFT JOIN TableD
然后
TableA INNER JOIN TableB
LEFT JOIN TableC ON TableB.c_id IS NULL
LEFT JOIN TableD
然后合并结果
更新
是
(A INNER JOIN B) LEFT JOIN C LEFT JOIN D
同:
A INNER JOIN (B LEFT JOIN C) LEFT JOIN D
?
【问题讨论】:
-
你为什么把它命名为
commutative? -
LEFTJOIN表示它(至少)保留左侧表格中的每一行,所以不,它不是“可交换的”跨度> -
我在提供的示例中看不到订单更改。如果您的问题是
TableA LEFT JOIN TableB <=> TableB LEFT JOIN TableA,答案是否定的。 -
当您提出问题时,您的脑海中有一些背景,但它只是在您的脑海中。
-
@Jim 。 . .查询的语义(它的作用)由
from子句中的表的顺序以及用于连接它们的连接类型决定。 SQL 优化器可能会选择不同的执行顺序,但给定查询的结果是根据 SQL 语句很好地定义的。
标签: mysql sql join left-join relational-algebra