0

据我所知,至少在 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

也许没有原因:)

4

1 回答 1

3

由于标准 SQL 的范围规则,存在限制。子句中的一个表from只是不知道另一个表中发生了什么。请记住,SQL 是一种描述性语言而不是过程性语言。子句中表的顺序from与处理它们的实际顺序完全没有必然关系。

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

至于cross apply与a相同或不同join。编写连接的方法有很多种,显式join语法只是其中一种。相关子查询、selects 中的嵌套查询、exists带有子查询和in带有子查询的查询都在执行一些关系连接操作的变体。它们的表达方式不同。

with 子查询的使用cross apply通常也是连接的类型。在某些情况下,可能存在非常复杂的查询以及嵌套使用 windows 函数的情况,在这种情况下,可能无法将查询重写为显式连接。不过,在大多数情况下,我都能做到。

于 2013-02-12T01:26:07.017 回答