代码之家  ›  专栏  ›  技术社区  ›  TehOne

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

  •  6
  • TehOne  · 技术社区  · 17 年前

    嵌套连接:

    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
    
    4 回复  |  直到 17 年前
        1
  •  5
  •   Mike Dinescu    17 年前

    嗯,这是操作顺序。。

    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
    

    在您的第二个示例中,您首先将t1与t2进行INNER JOIN,然后在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        
    

    可以改写为:

    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 JOIN将首先执行,然后才与表1相交。与第二个查询相反,它允许查询优化器完成自己的工作。

        2
  •  4
  •   Scott Ivey    17 年前

    对于您的具体示例,我认为生成的查询计划不应该有任何差异,但可读性肯定有差异。你的第二个例子更容易理解。

    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
    
        3
  •  2
  •   Ralph Wiggum    17 年前

    这些结果集没有差异 如果

    我在数据库上尝试了它,查询计划的不同之处在于

        4
  •  0
  •   Mike Woodhouse    17 年前