FROM (Entity SQL)

指定 SELECT 语句中使用的集合。

语法

FROM expression [ ,...n ] AS C

自变量

expression
任何可生成集合以用作 SELECT 语句中的源的有效查询表达式。

备注

FROM 子句是一个或多个 FROM 子句项的逗号分隔列表。 FROM 子句可用来为 SELECT 语句指定一个或多个源。 FROM 子句的最简单形式是单个查询表达式,标识用作 SELECT 语句中的源的集合和别名,如下例所示:

FROM C as c

FROM 子句项

每个 FROM 子句项都引用实体 SQL 查询中的一个源集合。 实体 SQL 支持 FROM 子句项的以下类:简单 FROM 子句项、JOIN FROM 子句项和 APPLY FROM 子句项。 下面几节将对这些 FROM 子句项逐一进行更详细地介绍。

简单 FROM 子句项

最简单的 FROM 子句项是标识一个集合和一个别名的单个表达式。 表达式可以只是实体集或子查询,或任何其他类型为集合的表达式。 以下是一个示例:

LOB.Customers as c

别名规范是可选的。 上面的 From 子句项的备选规范可以是:

LOB.Customers

如果未指定别名,实体 SQL 将尝试基于集合表达式生成别名。

JOIN FROM 子句项

JOIN FROM 子句项表示两个 FROM 子句项之间的联接。 实体 SQL 支持交叉联接、内部联接、左右外部联接和完全外部联接。 所有这些联接都受支持,这与在 Transact-SQL 中类似。 与在 Transact-SQL 中一样,JOIN 中涉及到的两个 FROM 子句项必须是独立的。 即,它们不能相关。 CROSS APPLYOUTER APPLY 可用于这些情况。

交叉联接

CROSS JOIN 查询表达式生成两个集合的笛卡儿积,如下例所示:

FROM C AS c CROSS JOIN D as d

内部联接

INNER JOIN 生成两个集合的约束笛卡儿积,如下例所示:

FROM C AS c [INNER] JOIN D AS d ON e

前面的查询表达式将 ON 条件为 true 的每一个左侧集合元素与其右侧集合的配对元素组合起来。 如果未指定 ON 条件,则 INNER JOIN 退化为 CROSS JOIN

左外部联接和右外部联接

OUTER JOIN 查询表达式生成两个集合的约束笛卡儿积,如下例所示:

FROM C AS c LEFT OUTER JOIN D AS d ON e

前面的查询表达式将 ON 条件为 true 的每一个左侧集合元素与其右侧集合的配对元素组合起来。 如果 ON 条件为 false,表达式仍处理与右侧元素(值为 null)配对的单个左侧元素实例。

RIGHT OUTER JOIN 可以以类似方式表示。

完全外部联接

显式 FULL OUTER JOIN 生成两个集合的约束笛卡儿积,如下例所示:

FROM C AS c FULL OUTER JOIN D AS d ON e

前面的查询表达式将 ON 条件为 true 的每一个左侧集合元素与其右侧集合的配对元素组合起来。 如果 ON 条件为 false,表达式仍处理与右侧元素(值为 null)配对的一个左侧元素实例。 此外,它还处理与左侧元素(值为 null)配对的一个左侧元素实例。

备注

为了保持与 SQL-92 的兼容性,Transact-SQL 中的 OUTER 关键字是可选的。 因此 LEFT JOINRIGHT JOINFULL JOINLEFT OUTER JOINRIGHT OUTER JOINFULL OUTER JOIN 的同义词。

APPLY 子句项

实体 SQL 支持两种 APPLYCROSS APPLYOUTER APPLY

CROSS APPLY 生成左侧集合的每个元素与通过计算右侧表达式得出的集合的元素的唯一配对。 利用 CROSS APPLY,右侧表达式在功能上依赖于左侧元素,如下面的关联集合示例所示:

SELECT c, f FROM C AS c CROSS APPLY c.Assoc AS f

CROSS APPLY 的行为与联接列表类似。 如果右侧表达式的计算结果为空集合,则 CROSS APPLY 不生成左侧元素实例的配对。

OUTER APPLYCROSS APPLY 类似,区别在于当右侧表达式计算结果为空集合时,仍然生成配对。 下面是一个 OUTER APPLY 的示例:

SELECT c, f FROM C AS c OUTER APPLY c.Assoc AS f

备注

不同于在 Transact-SQL 中,实体 SQL 中无需显式 unnest 步骤。

备注

SQL Server 2005 中引入了 CROSSOUTER APPLY 运算符。 在某些情况下,查询管道可能生成包含 CROSS APPLY 和/或 OUTER APPLY 运算符的 Transact-SQL。 由于某些后端提供程序(包括 SQL Server 2005 之前的 SQL Server 版本)不支持这些运算符,因此无法在这些后端提供程序上执行此类查询。

下面是一些可能导致输出查询中出现 CROSS APPLY 和/或 OUTER APPLY运算符的典型情况:分页相关子查询;相关子查询或导航所生成的集合上的 AnyElement;使用接受元素选择器的分组方法的 LINQ 查询;显式指定 CROSS APPLYOUTER APPLY 的查询;在 DEREF 构造上具有 REF 构造的查询。

FROM 子句中的多个集合

FROM 子句不能包含逗号分隔的多个集合。 在这些情况下,假定集合将联接在一起。 将它们视为一个 n 向 CROSS JOIN。

在以下示例中,CD 是独立的集合,但是 c.Names 依赖于 C

FROM C AS c, D AS d, c.Names AS e

下面的示例与前面的示例在逻辑上是等效的:

FROM (C AS c JOIN D AS d) CROSS APPLY c.Names AS e

左相关

FROM 子句中的项可以引用前面子句中指定的项。 在下面的示例中,CD 是独立集合,但 c.Names 依赖于 C

from C as c, D as d, c.Names as e

这在逻辑上等效于:

from (C as c join D as d) cross apply c.Names as e

语义

在逻辑上,FROM 子句中的集合假定为 n 向交叉联接的一部分(1 向交叉联接除外)。 FROM 子句中的别名是从左到右处理的,它们被添加到当前范围供以后引用。 FROM 子句假定生成行的多重集。 FROM 子句中的每一项都有一个字段,表示该集合项中的单个元素。

在逻辑上,FROM 子句生成类型为 Row(c, d, e) 的行多重集,其中字段 c、d 和 e 假定为元素类型 CDc.Names

实体 SQL 为范围中的每个简单 FROM 子句项引入一个别名。 例如,在下面的 FROM 子句代码段中,引入范围的名称为 c、d 和 e。

from (C as c join D as d) cross apply c.Names as e

在实体 SQL(不同于 Transact-SQL)中,FROM 子句仅将别名引入作用域。 任何对这些集合的列(属性)的引用都必须以别名进行限定。

从嵌套查询中拉取键

某些需要从嵌套查询提取键的查询类型不受支持。 例如,下面的查询是有效的:

select c.Orders from Customers as c

但是,下面的查询无效,因为该嵌套查询没有任何键:

select {1} from {2, 3}

请参阅