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

Teh*_*One 6 sql t-sql database sql-server join

我现在应该知道这一点,但是,如果下面两个陈述之间有什么区别呢?

嵌套连接:

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
Run Code Online (Sandbox Code Playgroud)

更传统的加入:

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
Run Code Online (Sandbox Code Playgroud)

Mik*_*scu 5

嗯,这是操作的顺序..

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
Run Code Online (Sandbox Code Playgroud)

可以改写为:

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
Run Code Online (Sandbox Code Playgroud)

所以基本上,你首先LEFT JOIN与T3 T2的基础上,加入条件:table3_ID = table2_ID,那么你的INNER JOIN与table2_ID = table1_ID T2 T1.

在第二个示例中,首先使用t2 INNER JOIN t1,然后在条件table2_ID = table1_ID上使用表t3 LEFT JOIN生成的内部联接.

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        
Run Code Online (Sandbox Code Playgroud)

可以改写为:

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
Run Code Online (Sandbox Code Playgroud)

编辑

我道歉.我的第一句话是错的.两个查询将产生相同的结果,但有可能在作为第一查询可能比在某些情况下(当表1仅包含表2中的元素的子集)作为LEFT所述第二查询执行较慢的性能差异联接将首先执行 - 然后才与table1相交.与允许查询优化器完成它的第二个查询相反.