不考虑性能,下面的查询 A 和 B 会得到相同的结果吗? C和D怎么样?
----- Scenario 1:
-- A (left join)
select *
from a left join b
on <blahblah>
left join c
on <blahblan>
-- B (left join)
select *
from a left join c
on <blahblah>
left join b
on <blahblan>
----- Scenario 2:
-- C (inner join)
select *
from a join b
on <blahblah>
join c
on <blahblan>
-- D (inner join)
select *
from a join c
on <blahblah>
join b
on <blahblan>
最佳答案
对于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
或ON a.x = 7
或ON a.x LIKE b.x
或ON (a.x, a.y) = (b.x, b.y)
并且这两个查询仍然是等效的。
但是,如果其中任何一个涉及 IS NULL
或与空值相关的函数,例如 COALESCE()
,例如如果条件是 b.ab_id IS NULL
,那么这两个查询将不等价。
关于sql - SQL 中的连接顺序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9614922/