Menggunakan subkueri skalar atau multinilai
Subkueri skalar adalah pernyataan SELECT dalam di kueri luar, ditulis untuk mengembalikan satu nilai. Subkueri skalar dapat digunakan di mana saja dalam pernyataan T-SQL luar di mana ekspresi bernilai tunggal diizinkan—seperti dalam klausa SELECT, klausa WHERE, klausa HAVING, atau bahkan klausa FROM. Mereka juga dapat digunakan dalam pernyataan modifikasi data, seperti UPDATE atau DELETE.
Subkueri multinilai, seperti namanya, dapat mengembalikan lebih dari satu baris. Namun mereka masih mengembalikan satu kolom.
Subkueri skalar
Misalkan Anda ingin mengambil rincian pesanan terakhir yang ditempatkan, dengan asumsi bahwa itu adalah satu dengan nilai SalesOrderID tertinggi.
Untuk menemukan nilai SalesOrderID tertinggi, Anda mungkin menggunakan kueri berikut:
SELECT MAX(SalesOrderID)
FROM Sales.SalesOrderHeader
Kueri ini mengembalikan nilai tunggal yang menunjukkan nilai tertinggi untuk OrderID dalam tabel SalesOrderHeader.
Untuk mendapatkan detail untuk pesanan ini, Anda mungkin perlu memfilter tabel SalesOrderDetails berdasarkan nilai apa pun yang dikembalikan oleh kueri di atas. Anda bisa menyelesaikan tugas ini dengan menumpuk kueri untuk mengambil SalesOrderID maksimum dalam klausa WHERE dari kueri yang mengambil detail pesanan.
SELECT SalesOrderID, ProductID, OrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderID =
(SELECT MAX(SalesOrderID)
FROM Sales.SalesOrderHeader);
Untuk menulis subkueri skalar, pertimbangkan panduan berikut:
- Untuk menunjukkan kueri sebagai subkueri, sertakan dalam tanda kurung.
- Beberapa tingkat subkueri didukung dalam T-SQL. Dalam modul ini, kita hanya akan mempertimbangkan kueri dua tingkat (satu kueri dalam di satu kueri luar), tetapi hingga 32 tingkat didukung.
- Jika subkueri tidak mengembalikan baris (set kosong), hasil subkueri adalah NULL. Jika memungkinkan dalam skenario Anda agar tidak ada baris yang dikembalikan, Anda harus memastikan kueri luar Anda dapat menangani NULL dengan mulus, selain hasil lain yang diharapkan.
- Kueri dalam umumnya harus mengembalikan satu kolom. Memilih beberapa kolom dalam subkueri hampir selalu merupakan kesalahan. Satu-satunya pengecualian adalah jika subkueri diperkenalkan dengan kata kunci EXISTS.
Subkueri skalar dapat digunakan di mana saja dalam kueri di mana nilai diharapkan, termasuk daftar SELECT. Misalnya, kita dapat memperluas kueri yang mengambil detail untuk pesanan terbaru untuk menyertakan jumlah rata-rata item yang dipesan, sehingga kita dapat membandingkan kuantitas yang dipesan dalam urutan terbaru dengan rata-rata untuk semua pesanan.
SELECT SalesOrderID, ProductID, OrderQty,
(SELECT AVG(OrderQty)
FROM SalesLT.SalesOrderDetail) AS AvgQty
FROM SalesLT.SalesOrderDetail
WHERE SalesOrderID =
(SELECT MAX(SalesOrderID)
FROM SalesLT.SalesOrderHeader);
Subkueri multinilai
Subkueri multinilai sangat cocok untuk mengembalikan hasil menggunakan operator IN. Contoh hipotetis berikut mengembalikan nilai CustomerID, SalesOrderID untuk semua pesanan yang dilakukan oleh pelanggan di Kanada.
SELECT CustomerID, SalesOrderID
FROM Sales.SalesOrderHeader
WHERE CustomerID IN (
SELECT CustomerID
FROM Sales.Customer
WHERE CountryRegion = 'Canada');
Dalam contoh ini, jika Anda hanya menjalankan kueri dalam, kolom nilai CustomerID akan dikembalikan, dengan baris untuk setiap pelanggan di Kanada.
Dalam banyak kasus, subkueri multinilai dapat dengan mudah ditulis menggunakan gabungan. Misalnya, berikut ini adalah kueri yang menggunakan gabungan untuk mengembalikan hasil yang sama dengan contoh sebelumnya:
SELECT c.CustomerID, o.SalesOrderID
FROM Sales.Customer AS c
JOIN Sales.SalesOrderHeader AS o
ON c.CustomerID = o.CustomerID
WHERE c.CountryRegion = 'Canada';
Jadi bagaimana Anda memutuskan apakah akan menulis kueri yang melibatkan beberapa tabel sebagai JOIN atau dengan subkueri? Terkadang, itu hanya tergantung pada apa yang membuat Anda lebih nyaman. Sebagian besar kueri bertumpuk yang mudah dikonversi ke JOIN sebenarnya akan dikonversi ke JOIN secara internal. Untuk kueri seperti itu, maka tidak ada perbedaan nyata dalam menulis kueri antara satu cara dengan cara yang lain.
Satu batasan yang harus Anda ingat adalah bahwa saat menggunakan kueri bertumpuk, hasil yang dikembalikan ke klien hanya bisa menyertakan kolom dari kueri luar. Jadi, jika Anda perlu mengembalikan kolom dari kedua tabel, Anda harus menulis kueri menggunakan JOIN.
Terakhir, ada situasi di mana kueri dalam perlu melakukan operasi yang jauh lebih rumit daripada pengambilan sederhana dalam contoh kami. Menulis ulang subkueri kompleks menggunakan JOIN bisa sulit. Banyak pengembang SQL menemukan subkueri bekerja paling baik untuk pemrosesan yang rumit karena memungkinkan Anda untuk memecah pemrosesan menjadi langkah-langkah yang lebih kecil.