2012-08-27 40 views
1

我不太确定如何描述这一点,我不太确定它是否只是语法糖。这是我第一次看到它,而且我无法找到对其原因和内容的参考或解释。是否有文档可以解释TSQL中的嵌套连接?

我有一个查询,如下所示:

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环境中。谢谢!

+0

我恨语法和删除只要有可能。尽管嵌套连接是左连接,但我更常见它。我不相信需要的人,但如果我留下语法,我会保留它们,因为它会提醒保险箱发生了一些不寻常的事情。我会尝试这一个,因为正常连接时间和两个结果,看看是否嵌套联接更快。如果保留它,否则,摆脱这种非标准语法。 – HLGEM

回答

3

加入顺序应在结果集中使用自然查询没有差别加入(外列顺序)。查询

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

产生相同的结果设置为

SELECT * 从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)进行过滤时,它特别有用。

select的T-SQL文档中,from条款下进入细节:

+0

我了解派生表/子查询。我的问题中的语法只是一个简写,允许在括号内省略'select * from'? – IronicMuffin

+0

否 - “from”子句的语法只允许您看到的括号。表格源可以是很多东西(表名,行集函数,用户定义的函数,openXML,派生表,旋转表或未转义表)。有些地方可能需要括号来消除歧义,但通常,对于“直接”SQL使用简单的表名连接,括号不应该有任何区别,我担心,事实上,他们可能会抛出查询优化器,迫使它以次优序列做事情,应该让查询优化器做它的工作作为一般规则。 –

2

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

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

产生相同的结果。

+0

-1因为它没有解决我的问题。 – IronicMuffin

+0

@IronicMuffin你的问题有两个?分数。 “括号是否必要?删除它们会改变连接顺序吗?”那不是直接回答你的问题吗? +1 – Paparazzi

+0

谢谢Blam的帮助 –

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. 反映开发人员在进入查询时的思考过程,因为他们将较大查询的那部分视为一个单元,然后将其应用到较大的查询中。
+0

从连接表3连接表4 ???我不认为这是正确的语法 –

+0

@АртёмЦарионов不是,那是一个错字。 –

相关问题