Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-这些连接之间有什么区别?_Sql_Sql Server_Database_Tsql_Join - Fatal编程技术网

SQL-这些连接之间有什么区别?

SQL-这些连接之间有什么区别?,sql,sql-server,database,tsql,join,Sql,Sql Server,Database,Tsql,Join,我现在应该知道这一点了,但是,如果下面两种说法有什么区别的话 嵌套联接: 更传统的连接: 对于您的特定示例,我认为生成的查询计划不应该有任何差异,但在可读性方面肯定有差异。你的第二个例子更容易理解 如果要反转示例中的联接类型,可能会得到截然不同的结果 SELECT t1.* FROM table1 t1 LEFT JOIN table2 t2 ON t2.table2_ID = t1.table1_ID INNER JOIN table3 t3 ON t3.table

我现在应该知道这一点了,但是,如果下面两种说法有什么区别的话

嵌套联接:

更传统的连接:


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

如果要反转示例中的联接类型,可能会得到截然不同的结果

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

嗯,这是行动的顺序

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
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
基本上,首先,根据连接条件,将t2与t3连接起来:table3\u ID=table2\u ID,然后将t1与table2\u ID=table1\u ID上的t2进行内部连接

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        
在第二个示例中,首先将t1与t2进行内部联接,然后在条件table2\u ID=table1\u 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 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
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中元素的子集时),第一个查询的执行速度可能比第二个查询慢,因为左连接将首先执行,然后才与表1相交。与第二个查询相反,第二个查询允许查询优化器完成它的工作。

查看这两个查询的不同之处的最佳方法是比较这两个查询的查询计划

如果表2中给定行的表3中始终有行,则这些的结果集没有差异

我在我的数据库上尝试了它,查询计划的不同之处在于 1.对于第一个查询,优化器选择首先对表2和表3进行连接。
2.对于第二个查询,优化器选择首先联接表1和表2。

如果您的DBMS优化器达到最新水平,您应该看不到这两个查询之间的任何差异。然而,即使对于大型、高成本的平台,这也不是我有信心做出的假设,因此我发现查询计划(以及执行时间)并不奇怪不同。

执行它们时,它们会给出相同的结果吗?理解第二个比理解第一个要容易得多——即使你在第一个LOJ中放置了(paren)。期待在这一点上投票选出一个好答案。在我有限的测试中,是的,他们给出了相同的结果。但是,我不想在此基础上做任何假设,因为我只在有限的数据下快速测试过。yikes,用“可视化”查询设计器构建了重写视图的闪回。一个查询中的左连接和右连接、嵌套连接以及试图找出和/或的顺序或操作(无参数)的可怕之处。显然,操作顺序不同,但是否存在任何实际差异(性能、结果、任何内容)?请给出一个数据示例,其中查询将返回不同的结果。我无法生成任何。好的,谢谢你对这家伙的想法。这和我当时想的差不多。结果将是相同的,但查询的执行可能不同。我认为为了便于使用,我将把旧的(嵌套的)查询改为使用更传统的语法。