是否有文档可以解释SQL中的嵌套连接?

时间:2012-08-27 15:54:33

标签: sql sql-server tsql sql-server-2005 join

我不太清楚如何描述这个,我不太确定它是否只是语法糖。这是我第一次看到它,而且我很难找到关于它的原因和内容的参考或解释。

我的查询如下:

select * from
     table1
          join table2 on field1 = field2
          join (
               table3 
                    join table4 on field3 = field4
                    join table5 on field5 = field6
               ) on field3 = field2 
               -- notice the fields in the parens and outside the parens 
               -- are part of the on clause

括号是否必要?删除它们会改变连接顺序吗?在这种情况下,我在SQL Server 2005环境中。谢谢!

3 个答案:

答案 0 :(得分:3)

加入顺序应该使用自然连接(在列顺序之外)对查询的结果集没有区别。查询

select *
from t1
join t2 on t2.t1_id = t1.id

生成与

相同的结果集

选择*    从t2开始    在t1.id = t2.t1_id

上加入t1

如果您正在使用外连接并更改from子句中表的顺序,那么外连接的方向必然会发生变化:

select *
from      t1
left join t2 on t2.t1_id = t1.id

相同
select *
from       t2
right join t1 on t1.id = t2.t1_id

但是,如果您看到用作表格的子查询,则语法如

select *
from t1
join ( select t2.*
       from t2
       join t3 on t3.t2_id = t2.id
       where t3.foobar = 37
     ) x on x.t1_id = t1.id

您将注意分配给上述子查询的表别名(x)。

你所拥有的是一种叫做派生表的东西(虽然有些人称之为虚拟表)。您可以将其视为查询生命周期中存在的临时视图。当您需要根据聚合结果(group by)过滤某些内容时,它特别有用。

selectfrom子句下的T-SQL文档详见:

答案 1 :(得分:2)

在这种情况下,他们没有必要:

select * from table1
join table2 on field1 = field2
join table3 on field3 = field2 
join table4 on field3 = field4
join table5 on field5 = field6

产生相同的结果。

答案 2 :(得分:2)

在这种情况下没有必要。

在某些其他方面,尤其是在命名嵌套调用的地方,这是必要的(或者至少更简单一些):

select table1.fieldX, table2.fieldY, sq.field6 from
table1 join table2 on field1 = field2
join ( select
   top 1 table3.field6
   from table3 join table4
   on field3 = field4
   where table3.field7 = table2.field8
   order by fieldGoshIveUsedALotOfFieldsAlready
           ) sq on sq.field6 = field12345

你的代码可能是:

  1. 像上面一样,然后重构。
  2. 生产机器。
  3. 反映开发人员在到达查询时的思维过程,因为他们将较大查询的那部分视为一个单元,然后将其用于更大的查询。