Jika Anda mendapatkan pesan kesalahan 512 yang berbunyi "Subquery mengembalikan lebih dari 1 nilai ..." di SQL Server, itu karena Anda menggunakan subquery yang mengembalikan lebih dari satu nilai dalam skenario di mana ini tidak diperbolehkan.
Contoh Kesalahan
Misalkan kita memiliki dua tabel berikut:
SELECT * FROM Dogs;
SELECT * FROM Cats;
Hasil:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 4 | Fluffy | +---------+-----------+ +---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Dan kami menjalankan kueri berikut terhadap dua tabel tersebut:
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats );
Hasil:
Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Kita dapat melihat bahwa itu menghasilkan kesalahan Msg 512.
Pesan kesalahan ini secara eksplisit memberi tahu kita bahwa “Subquery mengembalikan lebih dari 1 nilai” dan bahwa “Ini tidak diizinkan ketika subquery mengikuti =, !=, <, <=,>,>=atau ketika subquery digunakan sebagai ekspresi ”.
Solusi untuk ini akan bergantung pada apa yang Anda coba lakukan dalam kueri. Berikut adalah beberapa opsi untuk menyelesaikan masalah ini.
Solusi 1
Salah satu cara untuk mengatasinya adalah dengan menggunakan operator yang berbeda. Yang saya maksud adalah, gunakan operator selain =
, !=
, <
, <=
, >
, atau >=
.
Berikut adalah contoh yang menggunakan IN
operator:
SELECT * FROM Dogs
WHERE DogName IN ( SELECT CatName FROM Cats );
Hasil:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Solusi 2
Pilihan lain adalah menjaga persamaan (=
) operator (atau operator mana pun dalam kueri asli), tetapi ubah subkueri.
Berikut ini contoh mengubah subquery, sambil mempertahankan operator yang sama:
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats WHERE CatId = 2 );
Hasil:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Dalam hal ini subquery hanya mengembalikan satu nilai, dan operator equals tidak masalah dengan itu.
Solusi 3
Perhatikan bahwa subquery di atas hanya mengembalikan satu kolom. Jika subkueri mengembalikan beberapa kolom, kita perlu mengubah kueri luar agar menggunakan kode EXISTS
operator.
Contoh:
SELECT * FROM Dogs d
WHERE EXISTS ( SELECT * FROM Cats c WHERE c.CatName = d.DogName );
Hasil:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Jika kami tidak mengubahnya untuk menggunakan EXISTS
operator, maka kita mungkin akan mendapatkan pesan kesalahan 116.