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

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

Trong SQL Server, bạn có thể sử dụng T-SQL INTERSECT toán tử để trả về các hàng riêng biệt được xuất ra bởi cả truy vấn đầu vào bên trái và bên phải.

Cú pháp

Cú pháp như sau:

{ <query_specification> | ( <query_expression> ) }   
{ INTERSECT }  
{ <query_specification> | ( <query_expression> ) }

Trên thực tế, tài liệu của Microsoft bao gồm EXCEPT trong định nghĩa của nó, vì cú pháp tương tự áp dụng cho INTERSECTEXCEPT .

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     |
+---------+-----------+

Lưu ý rằng có một con mèo tên là Brush và cũng có hai con chó tên là Brush.

Chúng ta có thể sử dụng INTERSECT toán tử để chỉ trả về các hàng riêng biệt được xuất ra bởi cả truy vấn đầu vào bên trái và bên phải.

Nói cách khác, nó sẽ trả về bất kỳ giá trị nào xuất hiện trong cả hai bảng, nhưng nó sẽ chỉ trả về một hàng (ngay cả khi có nhiều hàng). Do đó, trong trường hợp của chúng tôi, nó sẽ trả về Brush .

Hãy làm điều đó.

SELECT 
    CatName AS PetName
FROM Cats
INTERSECT
SELECT 
    DogName AS PetName
FROM Dogs;

Kết quả:

Brush

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ề trong trường hợp này.

Điều này xuất hiện dưới dạng LEFT SEMI JOIN trong kế hoạch thực hiện.

Tương tự như làm như sau:

SELECT 
    DISTINCT CatName
FROM Cats c 
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Kết quả:

Brush

Lưu ý rằng khi sử dụng INTERSECT , 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 INTERSECT 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. Lược đồ máy chủ SQL và lược đồ mặc định

  2. Hướng dẫn hoàn chỉnh để sửa lỗi cơ sở dữ liệu SQL 5243

  3. Làm cách nào chúng ta có thể xem phần thân của thủ tục được lưu trữ được mã hóa trong SSMS?

  4. Làm thế nào để thả cột với ràng buộc?

  5. Tiện ích thay đổi mật khẩu SQL khéo léo để đặt lại mật khẩu SQL