Trong SQL Server, thông báo lỗi 116 xảy ra khi bạn cố gắng chọn nhiều cột trong một truy vấn con mà không giới thiệu nó với EXISTS
nhà điều hành.
Toàn bộ lỗi trông như thế này:
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.
Ví dụ
Dưới đây là ví dụ về truy vấn tạo ra lỗi này.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT * FROM Dogs);
Kết quả:
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.
Vấn đề với truy vấn này là truy vấn con sử dụng dấu hoa thị (*
) để chọn tất cả các cột từ Dogs
bàn. Bảng đó có nhiều cột và do đó lỗi được tạo ra.
Cách sửa lỗi
Chúng tôi có thể sửa lỗi trên bằng một số cách.
Một cách để khắc phục là thay thế dấu hoa thị (*
) với một tên cột trong truy vấn con:
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Điều này có nghĩa là truy vấn con bây giờ chỉ trả về một cột thay vì tất cả các cột trong bảng.
Một cách khác để khắc phục nó, là thực hiện những gì thông báo lỗi gợi ý và sử dụng EXISTS
toán tử thay vì IN
.
Thực hiện điều này yêu cầu một chút thay đổi trong cấu trúc truy vấn:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);
Như bạn có thể mong đợi, EXISTS
toán tử cũng sẽ hoạt động ngay cả khi bạn chỉ nêu rõ ràng một cột:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Nhưng ngược lại với IN
toán tử, EXISTS
cũng sẽ hoạt động nếu bạn chọn rõ ràng nhiều tên cột trong truy vấn con:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);