Di SQL Server, pesan galat 116 terjadi saat Anda mencoba memilih beberapa kolom dalam subkueri tanpa memasukkannya dengan EXISTS
operator.
Kesalahan lengkapnya terlihat seperti ini:
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.
Contoh
Berikut adalah contoh kueri yang menghasilkan kesalahan ini.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT * FROM Dogs);
Hasil:
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.
Masalah dengan kueri ini adalah bahwa subkueri menggunakan tanda bintang (*
) untuk memilih semua kolom dari Dogs
meja. Tabel tersebut memiliki beberapa kolom, sehingga terjadi kesalahan.
Cara Memperbaiki Kesalahan
Kami dapat memperbaiki kesalahan di atas dengan beberapa cara.
Salah satu cara untuk memperbaikinya adalah dengan mengganti tanda bintang (*
) dengan satu nama kolom di subquery:
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Ini berarti bahwa subquery sekarang mengembalikan hanya satu kolom, bukan semua kolom dalam tabel.
Cara lain untuk memperbaikinya, adalah melakukan apa yang disarankan oleh pesan kesalahan dan menggunakan EXISTS
operator alih-alih IN
.
Melakukan hal ini memerlukan sedikit variasi dalam konstruksi kueri:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);
Seperti yang Anda harapkan, EXISTS
operator juga akan berfungsi meskipun Anda hanya menyatakan satu kolom secara eksplisit:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Namun berbeda dengan IN
operator, EXISTS
juga akan berfungsi jika Anda secara eksplisit memilih beberapa nama kolom di subkueri:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);