FROM (实体 SQL)

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

语法

FROM expression [ ,...n ] AS C

论据

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

注解

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

FROM C as c

FROM 子句项

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

简单 FROM 子句项

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

LOB.Customers as c

别名规范是可选的。 上述子句项的替代规范如下:

LOB.Customers

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

JOIN FROM 子句项

JOIN FROM 句项表示两 FROM 个子句项之间的联接。 实体 SQL 支持交叉联接、内部联接、左右外部联接以及完整外部联接。 所有这些联接都受支持,类似于 Transact-SQL 中支持这些联接的方式。 与 Transact-SQL 中一样,涉及的JOINFROM个子句项必须独立。 也就是说,它们不能关联。 OUTER APPLYCROSS 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。

可能以类似的方式表示 A 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 关键字是可选的。 因此,,并且是 <a0/a0> 和的同义词。

APPLY 子句项

实体 SQL 支持两种类型的 APPLYCROSS APPLYOUTER APPLY

A CROSS APPLY 生成左侧集合的每个元素的唯一配对,该集合的元素由右侧的表达式求值生成的集合元素。 使用 a CROSS APPLY时,右侧的表达式在功能上依赖于左侧的元素,如以下关联的集合示例所示:

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

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

OUTER APPLY与 a CROSS APPLY类似,但即使右侧表达式的计算结果为空集合,也仍会生成配对。 下面是一个 OUTER APPLY示例:

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

注释

与 Transact-SQL 中不同,实体 SQL 中不需要显式的未引入步骤。

注释

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

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

FROM 子句中的多个集合

FROM 句可以包含多个用逗号分隔的集合。 在这些情况下,假定集合联接在一起。 将这些视为 N 向 CROSS JOIN。

在下面的示例中, C 并且 D 是独立的集合,但 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 项可以引用前面子句中指定的项。 在以下示例中, C 并且 D 是独立的集合,但 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 集合假定是一个-way 交叉联接的一 n部分(在 1 向交叉联接的情况下除外)。 子句中的 FROM 别名从左到右进行处理,并添加到当前范围以供以后引用。 假定该 FROM 子句生成多行集。 子句中每个项都有一个字段,表示该集合项中的 FROM 单个元素。

FROM 句在逻辑上生成行(c、d、e)类型的多组行,其中字段 c、d 和 e 假定为元素类型 CD并且 c.Names

实体 SQL 为作用域中的每个简单 FROM 子句项引入了别名。 例如,在以下 FROM 子句片段中,引入范围的名称为 c、d 和 e。

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

在 Entity SQL(与 Transact-SQL不同)中,子 FROM 句仅将别名引入范围。 这些集合中对列(属性)的任何引用都必须使用别名进行限定。

从嵌套查询拉取键

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

select c.Orders from Customers as c

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

select {1} from {2, 3}

另请参阅