Bagikan melalui


Menyusun Kueri SQL Entitas Berlapis

SQL Entitas adalah bahasa fungsional yang kaya. Blok penyusun SQL Entitas merupakan ekspresi. Tidak seperti SQL konvensional, SQL Entitas tidak terbatas pada kumpulan hasil bertabel: SQL Entitas mendukung dalam membuat ekspresi kompleks yang dapat memiliki harfiah, parameter, atau ekspresi berlapis. Nilai dalam ekspresi dapat memiliki parameter atau terdiri dari beberapa ekspresi lain.

Ekspresi Berlapis

Ekspresi berlapis dapat ditempatkan di mana saja nilai dari jenis yang dikembalikan ekspresi berlapis diterima. Misalnya:

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

Kueri berlapis dapat ditempatkan dalam klausul proyeksi. Misalnya:

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

Di SQL Entitas, kueri berlapis harus selalu diapit tanda kurung:

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

Contoh berikut menunjukkan cara menyarangkan ekspresi dengan benar di SQL Entitas: Cara: Mengurutkan Gabungan Dua Kueri.

Kueri yang Disarangkan dalam Proyeksi

Kueri berlapis dalam klausul proyek mungkin diterjemahkan ke dalam kueri produk Cartesian di server. Di beberapa server backend, termasuk SQL Server, hal ini dapat menyebabkan tabel TempDB menjadi sangat besar, yang dapat mempengaruhi performa server.

Berikut ini adalah contoh kueri semacam itu:

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

Memesan Kueri Bersarang

Dalam Entity Framework, ekspresi berlapis dapat ditempatkan di mana saja dalam kueri. Karena SQL Entitas memungkinkan fleksibilitas yang tinggi dalam menulis kueri, maka dimungkinkan menulis kueri yang berisi urutan kueri berlapis. Tetapi, urutan kueri berlapis tidak dipertahankan.

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

Lihat juga