FROM (Entity SQL)
指定 SELECT 陳述式中使用的集合。
語法
FROM expression [ ,...n ] AS C
引數
expression
任何有效的查詢運算式,該運算式可產生做為 SELECT
陳述式中之來源的集合。
備註
FROM
子句是一個或多個 FROM
子句項目的逗號分隔清單。 FROM
子句可以用來為 SELECT
陳述式指定一個或多個來源。 FROM
子句最簡單的形式是單一查詢運算式,該運算式可識別做為 SELECT
陳述式中之來源的集合和別名 (Alias),如下列範例所示:
FROM C as c
FROM 子句項目
每個 FROM
子句項目都會參考 Entity SQL 查詢中的一個來源集合。 Entity SQL 支援下列類別的 FROM
子句項目:簡單 FROM
子句項目、JOIN FROM
子句項目,以及 APPLY FROM
子句項目。 下列章節將更詳細說明這些 FROM
子句項目。
簡單 FROM 子句項目
最簡單的 FROM
子句項目是可識別集合和別名的單一運算式。 運算式可以是實體集或子查詢,或是型別為集合的任何其他運算式。 以下是一個範例:
LOB.Customers as c
別名規格是選擇性的。 上述 from 子句項目的替代規格可以是:
LOB.Customers
若未指定別名,Entity SQL 會嘗試根據集合運算式產生別名。
JOIN FROM 子句項目
JOIN FROM
子句項目代表介於兩個 FROM
子句項目之間的聯結。 Entity SQL 支援交叉聯結、內部聯結、左方和右方外部聯結,以及完整外部聯結, 且支援所有這些聯結的方式與 Transact-SQL 支援的方式相似。 與 Transact-SQL 相同,JOIN
中涉及的兩個 FROM
子句項目必須獨立。 也就是不能相互關聯。 CROSS APPLY
或 OUTER 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 JOIN
、RIGHT JOIN
和 FULL JOIN
是 LEFT OUTER JOIN
、RIGHT OUTER JOIN
和 FULL OUTER JOIN
的同義字。
APPLY Clause 子句項目
Entity SQL 支援兩種 APPLY
:CROSS APPLY
和 OUTER APPLY
。
CROSS APPLY
會以評估右運算式產生之集合的項目來產生左集合的每個項目的唯一配對。 使用 CROSS APPLY
,右運算式的作用相依於左項目,如下列關聯的集合範例所示:
SELECT c, f FROM C AS c CROSS APPLY c.Assoc AS f
CROSS APPLY
和聯結清單類似。 如果右運算式評估為空集合,CROSS APPLY
不會為左項目的那個例項產生配對。
OUTER APPLY
除了即使在右運算式評估為空集合時還是會產生配對之外,都跟 CROSS APPLY
類似。 以下是 OUTER APPLY
的範例:
SELECT c, f FROM C AS c OUTER APPLY c.Assoc AS f
注意
與 Transact-SQL 不同,在 Entity SQL 中不需要有明確使用 unnest 的步驟。
注意
SQL Server 2005 已導入了 CROSS
和 OUTER APPLY
運算子。 在某些案例中,查詢管線可能產生含有 CROSS APPLY
和 (或) OUTER APPLY
運算子的 Transact-SQL。 由於部分後端提供者 (包括 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
子句中的項目被假設為 n
向交叉聯結的一部分 (單向交叉聯結的案例除外)。 別名在 FROM
子句中的處理方向是由左至右,而且會被入至目前範圍,以供日後參考。 FROM
子句被假設為產生資料列的多重集 (Multiset)。 FROM
子句中的每個項目 (Item) 都會有一個欄位,其代表集合項目 (Item) 的單一項目 (Element)。
FROM
子句在邏輯上會產生型別為 Row(c, d, e) 之資料列的多重集,其中 c、d 和 e 被假設為是 C
、D
和 c.Names
的項目型別。
Entity 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}