对于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.xor ON a.x = 7或ON a.x LIKE b.xor)一起使用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?