Menggunakan operator APPLY

Selesai

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:

A screenshot showing the result set from the CROSS APPLY operator.