对于INNER
联接,不,顺序无关紧要。该查询将返回相同的结果,只要你改变你的选择SELECT *
来SELECT a.*, b.*, c.*
。
对于(LEFT
,RIGHT
或FULL
)OUTER
连接,是的,顺序是有意义的-和(更新)事情要复杂得多。
首先,外部联接不是可交换的,因此a LEFT JOIN b
与b LEFT JOIN a
外部联接也不是关联的,因此在您的示例中同时涉及(可交换性和关联性)两个属性:
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
等效于:
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
但:
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
AND c.bc_id = b.bc_id
不等于:
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
AND b.bc_id = c.bc_id
另一个(希望更简单)的关联示例。认为是(a LEFT JOIN b) LEFT JOIN c
:
a LEFT JOIN b
ON b.ab_id = a.ab_id -- AB condition
LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
这等效于a LEFT JOIN (b LEFT JOIN c)
:
a LEFT JOIN
b LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
ON b.ab_id = a.ab_id -- AB condition
仅因为我们有“好”的ON
条件。这两个ON b.ab_id = a.ab_id
和c.bc_id = b.bc_id
是平等的检查,不涉及NULL
比较。
您甚至可以与其他运算符或更复杂的运算符(例如:ON a.x <= b.x
or ON a.x = 7
或ON a.x LIKE b.x
or)一起使用ON (a.x, a.y) = (b.x, b.y)
,两个查询仍然相等。
但是,如果其中涉及任何IS NULL
一个或与null有关的函数COALESCE()
(例如,如果条件为)b.ab_id IS NULL
,则这两个查询将不相等。
<blahblah>
啊 您是将A加入B和A加入C,还是将A加入B和B加入C?