FROM (Entity SQL)
Указывает коллекцию, используемую в инструкциях SELECT .
Синтаксис
FROM expression [ ,...n ] AS C
Аргументы
expression
Любое допустимое выражение запроса, возвращающее коллекцию, которая используется как источник в инструкции SELECT
.
Замечания
Предложение FROM
- это список с разделителями-запятыми из одного или нескольких элементов предложения FROM
. Предложение FROM
может быть использовано, чтобы указать один или несколько источников для инструкции SELECT
. Самая простая форма предложения FROM
- единственное выражение запроса, которое определяет коллекцию и псевдоним, использованные как источники в инструкции SELECT
, как показано в следующем примере.
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, два FROM
элемента предложения, участвующие в ней JOIN
, должны быть независимыми. (т. е. они не могут быть коррелированными). В этих случаях можно использовать операторы 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
не выполняется, выражение все же обрабатывает единственный экземпляр элемента слева, поставленный в соответствие элементу справа, со значением NULL.
Оператор RIGHT OUTER JOIN
можно выразить аналогичным способом.
Полные внешние соединения
Явное соединение FULL OUTER JOIN
формирует ограниченное декартово произведение двух коллекций, как показано в следующем примере:
FROM C AS c FULL OUTER JOIN D AS d ON e
Предшествующее выражение запроса обрабатывает сочетание каждого элемента коллекции слева, сопоставленного каждому элементу коллекции справа, где условие ON
имеет значение TRUE. Если условие ON
не выполняется, выражение все же обрабатывает один экземпляр элемента слева, поставленный в соответствие элементу справа, со значением NULL. Выражение также обрабатывает один экземпляр элемента справа, сопоставленный с элементом слева, со значением NULL.
Примечание.
Чтобы сохранить совместимость с SQL-92, в Transact-SQL внешний ключевое слово является необязательным. Поэтому LEFT JOIN
, RIGHT JOIN
и FULL JOIN
являются синонимами для LEFT OUTER JOIN
, RIGHT OUTER JOIN
и FULL OUTER JOIN
.
Элемент предложения APPLY
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.
Примечание.
CROSS
в OUTER APPLY
SQL Server 2005 появились операторы. В некоторых случаях конвейер запросов может сформировать код Transact-SQL, который содержит операторы CROSS APPLY
и OUTER APPLY
. Так как некоторые серверные поставщики, включая версии SQL Server ранее SQL Server 2005, не поддерживают эти операторы, такие запросы нельзя выполнять на этих серверных поставщиках.
Некоторыми типичными сценариями, которые бы могли привести к появлению операторов 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
-стороннего перекрестного соединения (за исключением случая 1-стороннего перекрестного соединения). Псевдонимы в предложении FROM
обрабатываются слева направо и добавляются в текущую область для последующего применения. Предполагается, что предложение FROM
формирует мультинабор строк. В предложении FROM
будет одно поле для каждого элемента, которое представляет единственный элемент из этого элемента сбора.
Предложение 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}