我不太清楚如何描述这个,我不太确定它是否只是语法糖。这是我第一次看到它,而且我很难找到关于它的原因和内容的参考或解释。
我的查询如下:
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 :(得分: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
)过滤某些内容时,它特别有用。
select
下from
子句下的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
你的代码可能是: