【发布时间】:2016-03-08 20:48:09
【问题描述】:
我不得不将前雇员编写的代码转换为在新数据库中工作。在这样做的过程中,我遇到了一些我从未见过的连接,并且不完全理解它们是如何工作的,或者是否需要以这种方式完成它们。
连接看起来像这样:
From Table A
Join(Table B
Join Table C
on B.Field1 = C.Field1)
On A.Field1 = B.Field1
此代码的功能是否与以下代码不同:
From Table A
Join Table B
On A.Field1 = B.Field1
Join Table C
On B.Field1 = C.Field1
如果有差异,请说明第一组代码的用途。
所有这些都在 SQL Server 2012 中完成。提前感谢您提供的任何帮助。
【问题讨论】:
-
这并不罕见。您正在子查询中创建数据子集,允许您对子集与整个集合执行操作,如分组,如示例二所示。
-
我总是发现 from 子句中的括号非常令人困惑(除了描述派生表)。在我的一生中,我从来没有用括号写过联接(而且我写过成千上万的查询)。括号只是为了混淆。话虽如此,声明的结果是相同的。虽然它可能会强制连接顺序,但优化器无论如何都会做它认为合适的事情。在带有 LEFT/RIGHT/FULL 连接的语句中,需要进行一些调查。
-
@SteveMangiameli 我不确定我是否会跟随您对子集与整个集合进行分组。由于 B 中的同一字段等于 C 中的字段,因此 A 不会对一个字段进行分组以相同的方式影响另一个字段。我唯一一次看到子集上的分组是在执行完整的选择语句作为子查询时。虽然我对这一切还是很陌生。在旁注中,人们有什么理由在联接中编写完整的 Select 语句,而不是仅仅创建一个临时表并加入该表。在我看来,这样阅读要容易得多。
-
几个原因,都与资源和性能有关。我会在答案中举一个例子。
-
"[...]full select statement as the subquery" >>简称为派生表。
标签: join sql-server-2012