Tworzenie zagnieżdżonych zapytań w języku Entity SQL

Entity SQL to zaawansowany język funkcjonalny. Blok konstrukcyjny jednostki SQL jest wyrażeniem. W przeciwieństwie do konwencjonalnego języka SQL jednostka SQL nie jest ograniczona do tabelarycznego zestawu wyników: usługa Entity SQL obsługuje tworzenie złożonych wyrażeń, które mogą zawierać literały, parametry lub wyrażenia zagnieżdżone. Wartość w wyrażeniu może być sparametryzowana lub składać się z innego wyrażenia.

Wyrażenia zagnieżdżone

Zagnieżdżone wyrażenie można umieścić w dowolnym miejscu wartości zwracanego typu. Na przykład:

-- 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}}};

Zagnieżdżone zapytanie można umieścić w klauzuli projekcji. Na przykład:

-- 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

W jednostki SQL zapytania zagnieżdżone muszą być zawsze ujęte w nawiasy:

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

W poniższym przykładzie pokazano, jak prawidłowo zagnieżdżać wyrażenia w jednostce SQL: Jak: porządkować unii dwóch zapytań.

Zapytania zagnieżdżone w projekcji

Zapytania zagnieżdżone w klauzuli projektu mogą zostać przetłumaczone na zapytania produktów kartezjańskich na serwerze. W przypadku niektórych serwerów zaplecza, w tym programu SQL Server, może to spowodować, że tabela TempDB będzie bardzo duża, co może negatywnie wpłynąć na wydajność serwera.

Poniżej przedstawiono przykład takiego zapytania:

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

Porządkowanie zagnieżdżonych zapytań

W programie Entity Framework wyrażenie zagnieżdżone można umieścić w dowolnym miejscu w zapytaniu. Ponieważ język Entity SQL zapewnia dużą elastyczność podczas pisania zapytań, można napisać zapytanie zawierające kolejność zagnieżdżonych zapytań. Jednak kolejność zagnieżdżonego zapytania nie jest zachowywana.

-- 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

Zobacz też