Trong SQL Server, bạn có thể sử dụng SOME
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.
SOME
toán tử tương đương với ANY
toán tử logic.
Ví dụ
Hãy tưởng tượng 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 = SOME (SELECT DogName FROM Dogs);
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
so với ANY
Như đã đề cập, SOME
tương đương với ANY
.
Vì vậy, chúng tôi có thể thay đổi truy vấn của mình để sử dụng ANY
thay vì SOME
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
so với IN
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 IN
toán tử thay vì SOME
.
Ở đây nó đang sử dụng IN
nhà điều hành.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Kết quả:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
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.
Ở đây nó đang sử dụng 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 SOME
, có thể là do bạn đang chọn nhiều cột trong truy vấn con của mình. SOME
toán tử chỉ có thể được sử dụng với các truy vấn con có tậ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 = SOME (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.
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
.