不管性能如何,我会从下面的查询A和查询B得到相同的结果吗?C和D呢?

-- A
select *
from   a left join b
           on <blahblah>
       left join c
           on <blahblan>


-- B
select *
from   a left join c
           on <blahblah>
       left join b
           on <blahblan>  

-- C
select *
from   a join b
           on <blahblah>
       join c
           on <blahblan>


-- D
select *
from   a join c
           on <blahblah>
       join b
           on <blahblan>  

推荐答案

对于INNER次加入,不,顺序无关紧要.只要将 Select 从SELECT *更改为SELECT a.*, b.*, c.*,查询将返回相同的结果.


对于(LEFTRIGHTFULL)OUTER连接,是的,顺序很重要,而(updated)事情要复杂得多.

首先,外部连接是不可交换的,所以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

is equivalent to:

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

is not equivalent to:

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

这是is equivalenta 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相关问答推荐

如何在T—SQL中找到值更改之前的日期?

SQL查询组类值在同一行中,并连接和排序其他值

SQL使最终结果显示两个表后的所有数据(匹配和不匹配)?

替换条件中的单元格值

如何优化我的功能以减少花费的时间?

如何计算一个用户S的日常连胜?

将Dense_RANK列为聚合(非解析)函数(&A)

如何设计一个调用嵌套函数并仅在所有被调用的嵌套函数都提交时才提交的事务,例如,如果一个子函数失败则中止?

根据时间、状态和相关行在PostgreSQL中的存在来删除行

从类似JSON的字符串列创建新列

SQL仅返回第一个字母在A-Z之间的值

Postgresql - 如何根据阈值计算累积和

如何根据创建日期查找两个表中最接近的记录?

如何 for each id创建长度等于id长度的不同日期序列?

没有调用子查询的嵌套 JOIN语法是什么?

如何优化仅返回符合条件的三条记录的查询?

Clob 问题 - 将 clob 列拆分为多行

具有日期时间条件的存储过程

超过100名员工的连续行

在sql server中创建唯一标识符列