指定 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 中一样,涉及的JOIN
两FROM
个子句项必须独立。 也就是说,它们不能关联。
OUTER APPLY
或CROSS 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 关键字是可选的。 因此,,并且是 <
APPLY 子句项
实体 SQL 支持两种类型的 APPLY
: CROSS APPLY
和 OUTER 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 APPLY
OUTER 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 假定为元素类型 C
, D
并且 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}