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


Создание вложенных запросов Entity SQL (язык Entity SQL)

Entity SQL — это богатый функциональный язык. Блоком построения языка Entity SQL является выражение. В отличие от обычного языка SQL язык Entity SQL не ограничен табличными результирующими наборами: Entity SQL поддерживает составление сложных выражений, в которых могут присутствовать литералы, параметры или вложенные выражения. Значение в выражении может быть параметризованным или состоять из другого выражения.

Вложенные выражения

Вложенное выражение можно разместить в любом месте, где допустим тип возвращаемого им значения. Пример:

-- Returns a hierarchical collection of three elements at top-level. 
-- x must be passed in the parameter collection.
ROW(@x, {@x}, {@x, 4, 5}, {@x, 7, 8, 9})

-- Returns a hierarchical collection of one element at top-level.
-- x must be passed in the parameter collection.
{{{@x}}};

Вложенный запрос можно разместить в предложении проекции. Пример:

-- Returns a collection of rows where each row contains an Address entity.
-- and a collection of references to its corresponding SalesOrderHeader entities.
SELECT address, (SELECT DEREF(soh) 
                    FROM NAVIGATE(address, AdventureWorksModel.FK_SalesOrderHeader_Address_BillToAddressID) AS soh) 
                    AS salesOrderHeader FROM AdventureWorksEntities.Address AS address

В Entity SQL вложенные запросы всегда должны быть заключены в скобки.

-- Pseudo-Entity SQL
( SELECT …
FROM … )
UNION ALL
( SELECT …
FROM … );

В следующем примере показывается, как правильно вкладывать выражения Entity SQL: Как упорядочить два запроса, объединенных с помощью UNION (платформа Entity Framework).

Вложенные запросы в проекции

Вложенные запросы в предложении проекции могут быть преобразованы на сервере в запросы декартова произведения. На некоторых серверах баз данных, включая SLQ Server, это может привести к тому, что таблица TempDB станет слишком большой, поэтому производительность сервера снизится.

Ниже приведен пример такого запроса:

SELECT c, (SELECT c, (SELECT c FROM AdventureWorksModel.Vendor AS c  ) As Inner2 FROM AdventureWorksModel.JobCandidate AS c  ) As Inner1 FROM AdventureWorksModel.EmployeeDepartmentHistory AS c

Упорядочение вложенных запросов

На платформе Entity Framework вложенное выражение можно поместить в любом месте запроса. Язык Entity SQL обеспечивает большую гибкость при написании запросов, поэтому может быть создан запрос с упорядоченными вложенными запросами. Однако порядок вложенного запроса не сохраняется.

-- The following query will order the results by last name.
SELECT C1.FirstName, C1.LastName
        FROM AdventureWorksModel.Contact as C1
        ORDER BY C1.LastName

-- In the following query, ordering of the nested query is ignored.
SELECT C2.FirstName, C2.LastName
    FROM (SELECT C1.FirstName, C1.LastName
        FROM AdventureWorksModel.Contact as C1
        ORDER BY C1.LastName) as C2

См. также

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

Общие сведения о языке Entity SQL