无论性能如何,我都会从以下查询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,这两个查询将不相等。