回答

收藏

联接顺序在SQL中重要吗?

技术问答 技术问答 92 人阅读 | 0 人回复 | 2023-09-13

无论性能如何,我都会从以下查询A和B中都能得到同样的结果吗?C和D呢?
1 v. x. {! O: y$ g+ k# C( I( F-- Aselect *from   a left join b           on <strong>       left join c           on <strong>-- Bselect *from   a left join c           on <strong>       left join b           on <strong>-- Cselect *from   a join b           on <strong>       join c           on <strong>-- Dselect *from   a join c           on <strong>       join b           on <strong>                ( q4 t' q+ n' x5 g
    解决方案:                                                               
8 A8 b; {/ M* p                                                                对于INNER连接,不,顺序无关紧要。只要你改变选择,查询将返回相同的结果SELECT *来SELECT a.*,b.*,c.*。
, G& e. C5 ]) B对于(LEFT,RIGHT或FULL)OUTER连接,是的,顺序是有意义的-和(     更新    )事情要复杂得多。. {: s/ Y* w; @8 B; ^
首先,外部连接不可交换,因此a LEFT JOIN b与b LEFT JOIN a* N' V( Y+ Z( F9 A7 B* V9 ~8 S5 o! ^
外部连接不是相关的,所以在你的例子中同时涉及两个属性可交换性和相关性):
' P0 U1 g9 ^! Q1 ma LEFT JOIN b     ON b.ab_id = a.ab_id  LEFT JOIN c    ON c.ac_id = a.ac_id等效于    :: t# A4 N3 p9 t% N
a LEFT JOIN c     ON c.ac_id = a.ac_id  LEFT JOIN b    ON b.ab_id = a.ab_id但:+ C  o8 j  n' z' m* W1 T) p
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不等同于    :
- C+ g) U4 l1 m/ e0 Va 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:) X$ o; n$ l$ ^1 F
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):2 G6 k+ E1 ^/ ^$ ^* p$ i, V
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比较。
! ~# Z4 r' m2 ~9 ^! Q你甚至可以与其他运算符或更复杂的运算符(例如:ON a.x 2 t8 W: f$ B! G- ?
但是,如果其中任何一个涉及到IS NULL或与空值有关的函数COALESCE()(例如,如果条件是)b.ab_id ISNULL,这两个查询将不相等。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则