Menggunakan operator APPLY
Sebagai alternatif dalam menggabungkan atau membandingkan baris dari dua set, SQL Server menyediakan mekanisme untuk menerapkan ekspresi tabel dari satu set pada setiap baris di set yang lain. Operator APPLY memungkinkan kueri yang mengevaluasi baris dalam satu set input terhadap ekspresi yang menentukan set input kedua. APPLY sebenarnya adalah operator tabel, bukan operator set, dan APPLY merupakan bagian dari klausul FROM. APPLY lebih mirip seperti JOIN daripada operator set yang beroperasi pada dua tataan hasil kueri yang kompatibel.
Secara konseptual, operator APPLY mirip dengan subkueri berkorelasi karena menerapkan ekspresi tabel yang berkorelasi untuk setiap baris dari tabel. Namun, APPLY menampilkan hasil bernilai tabel daripada hasil skalar atau multi-nilai. Misalnya, ekspresi tabel mungkin saja adalah fungsi bernilai tabel. Anda dapat meneruskan elemen dari baris sebelah kiri sebagai parameter input ke fungsi bernilai tabel.
Ada dua bentuk APPLY:
- CROSS APPLY
- OUTER APPLY
Sintaks untuk APPLY adalah sebagai berikut:
SELECT <column_list>
FROM left_table_source { CROSS | OUTER } APPLY right_table_source
Penjelasan ini paling baik disajikan dengan sebuah contoh. Contoh pertama menggunakan INNER JOIN untuk menampilkan kolom dari tabel berikut:
- SalesLT.SalesOrderHeader.
- SalesLT.SalesOrderDetail.
Dalam contoh kode berikut, tabel digabung dengan menggunakan INNER JOIN:
SELECT oh.SalesOrderID, oh.OrderDate,od.ProductID, od.UnitPrice, od.Orderqty
FROM SalesLT.SalesOrderHeader AS oh
INNER JOIN SalesLT.SalesOrderDetail AS od
ON oh.SalesOrderID = od.SalesOrderID;
Dalam contoh kode berikut, CROSS APPLY menerapkan sumber tabel sebelah kanan ke setiap baris di sumber tabel sebelah kiri. Hanya baris dengan hasil baik di tabel kiri maupun tabel kanan saja yang ditampilkan. Sebagian besar pernyataan INNER JOIN dapat ditulis ulang sebagai pernyataan CROSS APPLY.
SELECT oh.SalesOrderID, oh.OrderDate,
od.ProductID, od.UnitPrice, od.Orderqty
FROM SalesLT.SalesOrderHeader AS oh
CROSS APPLY (SELECT productid, unitprice, Orderqty
FROM SalesLT.SalesOrderDetail AS od
WHERE oh.SalesOrderID = SalesOrderID
) AS od;
Dalam kedua kasus, tataan hasilnya sama: