SQL - 之间的这些加盟区别?(SQL - Difference between these J

2019-09-17 21:48发布

我现在可能已经知道这一点,但什么,如果有的话是下面两个语句之间的区别?

嵌套连接:

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

Answer 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

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

在第二个例子中,你首先INNER JOIN T1为T2,然后LEFT JOIN与条件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中的元素的子集)作为LEFT所述第二查询执行较慢的性能差异联接将首先被执行 - 也只有那时与table1的相交。 相对于第二个查询,让查询优化器做的工作。



Answer 2:

为了您的具体的例子,我不认为应该有生成的查询计划的任何差别,但有一定的可读性差。 你的第二个例子是更容易跟踪。

如果你是扭转加入本例中的类型,你可以用很多不同的结果结束。

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

-- may not produce the same results as...

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

在此基础上的连接顺序在许多情况下,无论是否事实 - 认真思考应该进入你写你怎么联接语法。 如果您发现第二个例子就是你真正想要实现,我会考虑重写查询,这样就可以把更多的强调你的加入顺序...

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


Answer 3:

看什么是这两个查询不同,最好的办法是比较的查询计划这两个查询。

没有这些,如果有总表3中列于表2给定的行中的结果集没有什么区别。

我试图在我的数据库和查询计划的区别是1.第一个查询,优化选择做对表2和表3中加入第一。 2.对于第二查询,优化选择了加盟Table 1和Table第一。



Answer 4:

您应该看到没有区别这两个查询之间的一切,只要你的DBMS”优化是达到标准。 然而,这即使对于大铁,高性价比的平台,是不是一个假设,我会做出有信心,所以我会很感到意外地发现变化,查询计划(因而执行时间)。



文章来源: SQL - Difference between these Joins?