gpt4 book ai didi

sql - SQL 中的连接顺序重要吗?

转载 作者:行者123 更新时间:2023-12-03 04:16:21 25 4
gpt4 key购买 nike

不考虑性能,下面的查询 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.* .

<小时/>

对于(LEFTRIGHTFULL)OUTER连接,是的,顺序很重要 - 并且(更新)事情要复杂得多。

首先,外连接不可交换,因此 a LEFT JOIN bb 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_idc.bc_id = b.bc_id是平等检查,不涉及 NULL比较。

您甚至可以使用其他运算符或更复杂的条件,例如:ON a.x <= b.xON a.x = 7ON a.x LIKE b.xON (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com