Поделиться через


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}

См. также