Di SQL Server, ALL
operator dapat digunakan dengan subkueri untuk membandingkan nilai skalar dengan kumpulan nilai kolom tunggal yang dikembalikan oleh subkueri.
Benar juga bahwa SELECT
klausa dan UNION
operator keduanya menerima ALL
argumen, meskipun penggunaan ini memiliki tujuan yang berbeda (memungkinkan duplikat dalam kumpulan hasil).
Di bawah ini adalah contoh penggunaan ALL
operator dengan subquery.
Contoh
Asumsikan kita memiliki dua tabel; Cats
dan Dogs
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Sekarang mari kita jalankan subquery menggunakan ALL
operator.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);
Hasil:
(0 rows affected)
Dalam hal ini, tidak ada baris yang dikembalikan. Ini karena ALL
membutuhkan ekspresi skalar untuk membandingkan secara positif dengan setiap nilai yang dikembalikan oleh subquery.
Dalam hal ini, subkueri sangat luas sehingga semua baris dari Dogs
meja dikembalikan. Ini akan mengharuskan setiap anjing memiliki setidaknya satu kucing yang sesuai dengan nama yang sama.
Mari kita ubah sedikit subquery.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Hasil:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Dalam hal ini saya mendapatkan hasil positif, karena semua baris yang dikembalikan oleh subquery memiliki baris yang sesuai di Cats
tabel (walaupun hanya satu baris).
Kembalikan yang Berlawanan
Kami dapat menggunakan operator perbandingan apa pun dengan ALL
. Jadi kita bisa memodifikasi contoh sebelumnya untuk mengembalikan hasil sebaliknya, cukup dengan mengubah operator equals (=) menjadi tidak sama dengan operator (baik <>
atau !=
non standar non ISO ).
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (SELECT DogName FROM Dogs);
Hasil:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
Jadi, alih-alih mengembalikan semua baris yang memiliki baris yang sesuai di subkueri, kami mengembalikan semua baris yang tidak memiliki baris yang sesuai.
Dan kita dapat melakukan hal yang sama dengan contoh lainnya.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Hasil:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
Kesalahan 116?
Jika Anda mendapatkan kesalahan 116 saat menggunakan ALL
, itu mungkin karena Anda memilih beberapa kolom di subkueri Anda. ALL
operator hanya dapat digunakan dengan subkueri yang memiliki kumpulan hasil satu kolom.
Berikut adalah contoh bagaimana kami dapat menyebabkan kesalahan ini.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogId, DogName FROM Dogs);
Saya hanya menambahkan kolom ke subquery.
Ini adalah kesalahan umum saat menggunakan operator wildcard untuk memilih semua kolom di subkueri.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT * FROM Dogs);
Bagaimanapun, hasilnya sama:
Msg 116, Level 16, State 1, Line 5 Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.