为什么在连接集中使用别名限制

时间:2013-02-12 01:09:04

标签: sql

据我所知,至少在SQL Server中,我们不能使用用于与该表连接的集合中的表中的别名。

在一个例子中:

CREATE TABLE A (A1 int, A2 int)
CREATE TABLE B (B1 int, B2 int)
SELECT a.A2
FROM
  A as a
INNER JOIN
  (SELECT * FROM B as b WHERE b.B1=a.A1) b2 ON b2.B2=a.A2

该查询将导致错误,因为别名 a 正在集合中使用,该集合将加入别名引用的表中( A )。

在SQL Server中,这可以使用 CROSS APPLY 解决,也可以通过重写查询来解决。 (这是我的问题)。

我的问题是:为什么存在此限制?,为什么不将别名用作SQL Server CROSS APPLY

我的第一个猜测是:并行性。如果我们可以限制它,那么看起来连接的每个集合总是可以并行计算然后连接起来。但这只是猜测。它可以更灵活,让我使用别名并计算连接集之间的依赖关系,因为我猜是 CROSS APPLY

也许没有原因:)

1 个答案:

答案 0 :(得分:3)

由于标准SQL的作用域规则,存在限制。 from子句中的一个表只是不知道内部另一个表中发生了什么。请记住,SQL是描述性语言,而不是过程语言。 from子句中表的顺序与处理它们的实际顺序完全无关。

此限制不适用于SELECTWHEREHAVING子句,因为首先评估FROM子句。

至于cross applyjoin相同或不同。有许多方法可以编写联接,而显式join语法只是其中之一。相关子查询,select中的嵌套查询,带子查询的exists和带有子查询的in都执行关系连接操作的某种变体。他们的表达方式不同。

cross apply与子查询的使用通常也是连接类型。可能存在一些具有嵌套使用windows函数的非常复杂查询的情况,其中可能无法将查询重写为显式连接。但在大多数情况下,我已经能够。