Trong SQL Server, ALL
toán tử có thể được sử dụng với một truy vấn con để so sánh một giá trị vô hướng với một tập hợp giá trị cột đơn được trả về bởi truy vấn con.
Cũng đúng khi SELECT
mệnh đề và UNION
cả hai toán tử đều chấp nhận ALL
đối số, mặc dù cách sử dụng này có mục đích khác (cho phép trùng lặp trong tập kết quả).
Dưới đây là các ví dụ về việc sử dụng ALL
toán tử với một truy vấn con.
Ví dụ
Giả sử chúng ta có hai bảng; Cats
và Dogs
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Bây giờ chúng ta hãy chạy một truy vấn con bằng ALL
nhà điều hành.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);
Kết quả:
(0 rows affected)
Trong trường hợp này, không có hàng nào được trả lại. Điều này là do ALL
yêu cầu biểu thức vô hướng để so sánh tích cực với mọi giá trị được trả về bởi truy vấn con.
Trong trường hợp này, truy vấn con quá rộng đến mức tất cả các hàng từ Dogs
bảng đã được trả lại. Điều này yêu cầu mỗi con chó phải có ít nhất một con mèo tương ứng có cùng tên.
Hãy thay đổi truy vấn con một chút.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Trong trường hợp này, tôi nhận được kết quả dương tính, vì tất cả các hàng được trả về bởi truy vấn con đều có một hàng tương ứng trong Cats
bảng (mặc dù chỉ có một hàng).
Trả lại Ngược lại
Chúng tôi có thể sử dụng bất kỳ toán tử so sánh nào với ALL
. Vì vậy, chúng tôi có thể sửa đổi các ví dụ trước đó để trả về kết quả ngược lại, đơn giản bằng cách thay đổi toán tử bằng (=) thành một toán tử không bằng (hoặc <>
hoặc không theo tiêu chuẩn ISO !=
).
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (SELECT DogName FROM Dogs);
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
Vì vậy, thay vì trả về tất cả các hàng có một hàng tương ứng trong truy vấn con, chúng tôi trả về tất cả các hàng không có một hàng tương ứng.
Và chúng ta có thể làm điều tương tự với ví dụ còn lại.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
Lỗi 116?
Nếu bạn gặp lỗi 116 khi sử dụng ALL
, có thể là do bạn đang chọn nhiều cột trong truy vấn con của mình. ALL
toán tử chỉ có thể được sử dụng với các truy vấn con có tập hợp kết quả là một cột.
Dưới đây là một ví dụ về cách chúng tôi có thể gây ra lỗi này.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogId, DogName FROM Dogs);
Tôi chỉ cần thêm một cột vào truy vấn con.
Đó là một lỗi phổ biến khi sử dụng toán tử ký tự đại diện để chọn tất cả các cột trong truy vấn con.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT * FROM Dogs);
Dù bằng cách nào, kết quả là như nhau:
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.