【问题标题】:Is the order of multiple INNER JOIN-s related with the tables relashionship?多个 INNER JOIN 的顺序是否与表关系有关?
【发布时间】:2016-05-18 00:31:54
【问题描述】:

我想使用 INNER JOIN 语句连接一些表。其中一些具有多对多关系,一些是一对多,一些是一对一。我想知道 INNER JOIN-s 语句的顺序是否重要,它是否与 relashionship 的类型(一对一,一对多等)有关?那么下面这三个代码输出的结果是一样的吗?

SELECT ....
FROM table1
INNER JOIN (table2 INNER JOIN table3 ON table2.col=table3.col)
ON table1.col=table2.col


SELECT ....
FROM table1
INNER JOIN (table2 INNER JOIN table3 ON table2.col=table3.col)
ON table1.col=table3.col

SELECT ....
FROM table2
INNER JOIN (table1 INNER JOIN table3 ON table1.col=table3.col)
ON table3.col=table2.col
我可以用下面这段代码替换两个表的INNER JOIN吗?那么下面这段代码代表表1和表2的内连接吗?

SELECT ...
FROM table1,table2
WHERE (table1.col=table2.col)

【问题讨论】:

  • 我不这么认为。但是对于每个 SQL sn-p 查看执行计划,看看是否可以发现其中的任何差异
  • "下面这三个代码输出的结果一样吗?"你的意思是查询计划?因为对于实际的结果,你可以自己测试一下。

标签: sql-server join


【解决方案1】:

对于 INNER JOIN,它会给出相同的结果,但对于其他类型的连接,它会给出不同的结果。 例如:

SELECT ....
FROM table1
LEFT JOIN (table2 INNER JOIN table3 ON table2.col=table3.col)
ON table1.col=table2.col

以上等价于

SELECT ....
FROM table1
LEFT JOIN (
    Select table2.col 
    From table2 INNER JOIN table3 ON table2.col=table3.col
    ) tbl
ON table1.col=tbl.col

首先它将执行 table2 和 table3 的 INNER JOIN 然后 table1 将与结果保持连接

【讨论】:

    【解决方案2】:

    连接的确切顺序无关紧要。

    更好用

    select ...
    from table1
    inner join table2 on table2.col=table1.col
    inner join table3 on table3.col=table1.col
    

    是的,INNER JOIN 可以替换为

    WHERE t1.col=t2.col
    

    和 SQL 计划将是相同的。 但是如果在 where 条件下还有其他过滤器 - 会混合。

    另外,如果有额外的连接条件 - 最好先过滤掉所有不需要的记录。

    【讨论】:

    • "INNER JOIN 可以替换为 WHERE" 但是,就像你说的,如果可以避免,人们不应该这样做! JOINs 旨在避免这种情况,并带来许多其他好处。 虽然,公平地说,我有时确实觉得我必须使用wheres 来避免 Microsoft Access 糟糕的join 语法......呃。
    • @underscore_d 永远不会用whereleft join 和条件替换内部连接。内连接总是更快更好的方法,也更容易阅读。在某些情况下,当您检查您的执行计划时,您可以比较内部联接与 where 查询。有时它是相同的并且都很快,但大多数情况下内部连接会更快,执行计划更好
    • 即使其中一个表的主键由 2 个或多个外键组成,JOINS 的顺序是否不重要?
    • @user5827762 不用担心,如果您正在使用连接,那么您正在尽最大努力使用 SQL。服务器会帮你处理的,没关系
    • @krtek 当然,“从不”,除非糟糕的 Access 语法意味着您没有时间坐在那里嵌套 inner join (a inner join (b inner join (noooooo 并完全正确地处理这个烂摊子。看,我的帖子与你的意见一致,但我提到了一个例子,我承认由于平台的限制而违背了我自己的建议。显然这还不够细致。
    【解决方案3】:

    这对结果完全没有影响。因为您只使用内部连接,所以只会显示所有三个表中的匹配项。

    如果您要在一个查询中使用 LEFT OUTER 联接和 INNER 联接,则可以改变结果集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-27
      • 2013-11-05
      • 2020-07-26
      • 1970-01-01
      • 2017-12-13
      • 2012-10-15
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多