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


Создание вложенных запросов 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 :  Как упорядочить объединение двух запросов (платформа 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