Bạn có thể sử dụng T-SQL EXCEPT
toán tử trong SQL Server để trả về các hàng khác biệt với truy vấn đầu vào bên trái mà truy vấn đầu vào bên phải không xuất ra.
Cú pháp
Cú pháp như sau:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) }
Trên thực tế, tài liệu của Microsoft bao gồm INTERSECT
trong định nghĩa của nó, vì cú pháp tương tự áp dụng cho EXCEPT
và INTERSECT
.
Cú pháp của Microsoft như sau:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Ví dụ
Hãy tưởng tượng bạn có hai bảng; Cats
và Dogs
.
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Brush | | 2 | Scarcat | | 3 | Flutter | | 4 | Flutter | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Yelp | | 2 | Woofer | | 3 | Brush | | 4 | Brush | +---------+-----------+
Chúng ta có thể sử dụng EXCEPT
toán tử để chỉ trả về các hàng riêng biệt từ truy vấn đầu vào bên trái mà không được xuất ra bởi truy vấn đầu vào bên phải.
Đây là một ví dụ.
SELECT CatName FROM Cats
EXCEPT
SELECT DogName FROM Dogs;
Kết quả:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Vì vậy, chúng tôi chỉ nhận được các giá trị xuất hiện trong Cats
bảng cũng không xuất hiện trong Dogs
bàn. Như đã đề cập, nó trả về các hàng riêng biệt, vì vậy chỉ một hàng được trả về cho Flutter
.
Chúng tôi cũng có thể chuyển đổi nó và đặt Dogs
bảng bên trái và Cats
ở bên phải.
SELECT DogName FROM Dogs
EXCEPT
SELECT CatName FROM Cats;
Kết quả:
+-----------+ | DogName | |-----------| | Woofer | | Yelp | +-----------+
EXCEPT
toán tử xuất hiện dưới dạng LEFT ANTI SEMI JOIN
trong kế hoạch thực hiện.
Vì vậy, ví dụ đầu tiên của chúng tôi tương tự như làm như sau:
SELECT
DISTINCT CatName
FROM Cats c
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Kết quả:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Lưu ý rằng khi sử dụng EXCEPT
, số lượng và thứ tự của các cột phải giống nhau trong tất cả các truy vấn. Ngoài ra, các loại dữ liệu phải tương thích. Chúng thực sự không nhất thiết phải giống nhau, nhưng chúng phải có thể so sánh được thông qua chuyển đổi ngầm định.
Ngoài ra, khi so sánh các giá trị cột để xác định DISTINCT
hàng, hai NULL
các giá trị được coi là bằng nhau.
Nếu bạn định sử dụng EXCEPT
trong các truy vấn phân tán, hãy lưu ý rằng nó chỉ được thực thi trên máy chủ cục bộ và không được đẩy đến máy chủ được liên kết và do đó, điều này có thể ảnh hưởng đến hiệu suất.