Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Указывает коллекцию, используемую в инструкциях SELECT .
Синтаксис
FROM expression [ ,...n ] AS C
Аргументы
expression
Любое допустимое выражение запроса, которое дает коллекцию для использования в качестве источника в инструкции SELECT .
Замечания
Предложение FROM — это разделенный запятыми список одного или нескольких FROM элементов предложения. Предложение FROM можно использовать для указания одного или нескольких источников для инструкции SELECT . Простейшая форма FROM предложения — это одно выражение запроса, определяющее коллекцию и псевдоним, используемый в качестве источника в инструкции, как показано в SELECT следующем примере:
FROM C as c
Элементы предложения FROM
Каждый FROM элемент предложения ссылается на исходную коллекцию в запросе Entity SQL. Entity SQL поддерживает следующие классы элементов предложения: простые FROMFROM элементы предложения, JOIN FROM элементы предложения и APPLY FROM элементы предложения. Каждый из этих FROM элементов предложения подробно описан в следующих разделах.
Простой элемент предложения FROM
Самый простой FROM элемент предложения — это одно выражение, определяющее коллекцию и псевдоним. Выражение может быть просто набором сущностей, вложенным запросом или любым другим выражением, которое является типом коллекции. Ниже приведен пример:
LOB.Customers as c
Спецификация псевдонима является необязательной. Альтернативная спецификация приведенного выше элемента предложения может быть следующей:
LOB.Customers
Если псевдоним не указан, Entity SQL пытается создать псевдоним на основе выражения коллекции.
ЭЛЕМЕНТ предложения JOIN FROM
Элемент JOIN FROM предложения представляет соединение между двумя FROM элементами предложения. Entity SQL поддерживает перекрестные соединения, внутренние соединения, левые и правые внешние соединения и полные внешние соединения. Все эти соединения поддерживаются аналогично тому, как они поддерживаются в Transact-SQL. Как и в Transact-SQL, два FROM элемента предложения, участвующие в ней JOIN , должны быть независимыми. То есть они не могут быть сопоставлены.
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.
Может 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
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 то в левой части этого экземпляра элемента не создается никаких пар.
CROSS APPLYПохоже на OUTER 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-way 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}