一尘不染

SQL-这些联接之间的区别?

sql

我可能现在应该知道这一点,但是以下两个语句之间的区别是什么?

嵌套联接:

SELECT
    t1.*
FROM
    table1 t1
    INNER JOIN table2 t2
        LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
    ON t2.table2_ID = t1.table1_ID

比较传统的联接:

SELECT
    t1.*
FROM
    table1 t1
    INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID
    LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID

阅读 131

收藏
2021-05-23

共1个答案

一尘不染

好吧,这是操作的顺序。

SELECT
    t1.*
FROM
    table1 t1
    INNER JOIN table2 t2
        LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
    ON t2.table2_ID = t1.table1_ID

可以改写为:

SELECT
    t1.*
FROM
       table1 t1                                                       -- inner join t1
    INNER JOIN 
       (table2 t2 LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID)  -- with this 
    ON t2.table2_ID = t1.table1_ID                                     -- on this condition

因此,基本上,首先根据连接条件:t3将t2与t3左连接,然后在table2_ID = table1_ID上与t2对IN1进行t1内连接。

在第二个示例中,首先将INNER JOIN t1与t2组合在一起,然后在条件table2_ID = table1_ID上与表t3进行左联接。

SELECT
    t1.*
FROM
    table1 t1
    INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID
    LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID

可以改写为:

SELECT
    t1.*
FROM
        (table1 t1 INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID) -- first inner join
    LEFT JOIN                                                           -- then left join
        table3 t3 ON t3.table3_ID = t2.table2_ID                        -- the result with this

编辑

我道歉。我的第一句话是错误的。这两个查询将产生相同的结果,但是在性能上可能会有所不同,因为在某些情况下(当表1仅包含表2中元素的子集时),第一个查询的执行可能会比第二个查询慢。首先执行-然后才与table1相交。与第二个查询相反,第二个查询允许查询优化器完成其工作。

2021-05-23