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

标签 sql join relational-database

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

相关文章:

sql - 任何 SQL 数据库 : When is it better to fetch a whole table instead of querying for particular rows?

sql - 选择两个日期之间的所有日期

mysql - 在 MySQL 中使用 left Join 进行最佳拟合数据重试

java - 如何使用带有二级索引键的 Guava Cache?

database-design - 菱形关系——认同还是非认同?

sql - 在两个数据库表中进行循环引用是一种好习惯吗

sql - 列数据类型中 BYTE 和 CHAR 的区别

mysql - MySQL 中空表的左连接返回错误

join - SSRS折线图未连接数据点

couchdb - 设计文档数据库架构