Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách EXCEPT hoạt động trong SQL Server

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 EXCEPTINTERSECT .

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; CatsDogs .

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn để liệt kê tất cả các thủ tục được lưu trữ

  2. Giá trị thập phân trong SQL để chia kết quả

  3. Cấu hình sao chép giao dịch SQL Server

  4. Làm cách nào để lấy danh sách tên phần tử từ một giá trị XML trong SQL Server

  5. Có Rủi ro Bảo mật Liên quan đến Giám sát Đám mây Spotlight không?