Trong SQL Server, bạn có thể sử dụng ANY
toán tử logic để 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 một truy vấn con.
Nó 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.
ANY
toán tử tương đương với SOME
toán tử logic.
Ví dụ
Giả sử chúng ta có hai bảng; Cats
và Dogs
Mèo
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Chó
+---------+-----------+ | 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 ANY
nhà điều hành.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
so với SOME
Chúng tôi sẽ nhận được kết quả tương tự nếu chúng tôi thay đổi truy vấn xung quanh để nó sử dụng SOME
toán tử thay vì ANY
.
Ở đây nó đang sử dụng SOME
toán tử thay vì ANY
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
so với IN
Chúng tôi cũng có thể sử dụng IN
toán tử để nhận được cùng một kết quả.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
so với EXISTS
Chúng tôi có thể làm điều tương tự với EXISTS
nhà điều hành.
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Lỗi 116?
Nếu bạn gặp lỗi 116 khi sử dụng ANY
, có thể là do bạn đang chọn nhiều cột trong truy vấn con của mình. ANY
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 = ANY (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.
Theo nghĩa này, ANY
toán tử tương tự hơn với IN
so với toán tử EXISTS
nhà điều hành. Chúng tôi sẽ gặp lỗi tương tự với IN
.
Nếu bạn phải trả về nhiều cột trong truy vấn con của mình, hãy sử dụng EXISTS
.