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


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.

NoteПримечание.

Чтобы сохранить совместимость с SQL-92, в языке Transact-SQL ключевое слово OUTER не является обязательным. Поэтому 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

NoteПримечание.

В отличие от языка Transact-SQL, в Entity SQL не требуется явный шаг для устранения вложенности.

NoteПримечание.

Операторы 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}

См. также

Основные понятия

Справочник по Entity SQL
Выражения запросов (язык Entity SQL)
Структурированные типы, допускающие значение NULL (язык Entity SQL)