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 INTERSECT
và EXCEPT
.
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 | +---------+-----------+
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.