22/08/2018, 11:14

Toán tử INTERSECT trong SQL Server

Trong SQL Server (Transact-SQL), toán tử INTERSECT được dùng để trả về các bản ghi nằm trong cả 2 bộ dữ liệu hoặc lệnh SELECT. Nếu một bản ghi chỉ có trong một truy vấn chứ không có trong truy vấn còn lại, nó sẽ bị loại bỏ khỏi bộ kết quả của INTERSECT. Truy ...

Trong SQL Server (Transact-SQL), toán tử INTERSECT được dùng để trả về các bản ghi nằm trong cả 2 bộ dữ liệu hoặc lệnh SELECT. Nếu một bản ghi chỉ có trong một truy vấn chứ không có trong truy vấn còn lại, nó sẽ bị loại bỏ khỏi bộ kết quả của INTERSECT.

Truy vấn INTERSECT

Minh họa kết quả trả về từ truy vấn INTERSECT
Minh họa kết quả trả về từ truy vấn INTERSECT

Giải thích: Truy vấn INTERSECT sẽ trả về các bản ghi nằm trong khu vực tô màu xanh. Các bản ghi này nằm trong cả CSDL1 và CSDL2.

Mỗi lệnh SELECT trong INTERSECT phải có cùng số cột trong bộ kết quả với kiểu dữ liệu giống nhau.

Cú pháp toán tử INTERSECT 

SELECT bieu_thuc1, bieu_thuc2, … bieu_thucn
FROM bang
[WHERE dieu_kien]
INTERSECT
SELECT bieu_thuc1, bieu_thuc2, … bieu_thucn
FROM bang
[WHERE dieu_kien];

Tên biến hoặc giá trị biến

bieu_thuc

Cột hoặc giá trị mà bạn muốn so sánh giữa 2 lệnh SELECT. Chúng không nhất thiết phải nằm trong cùng 1 trường thông tin ở mỗi lệnh SELECT nhưng các cột tương ứng phải có dữ liệu giống nhau.

bang

Bảng muốn lấy bản ghi từ đó. Phải có ít nhất 1 bảng trong mệnh đề FROM.

WHERE dieu_kien

Tùy chọn. Điều kiện phải đáp ứng để bản ghi được chọn.

Lưu ý:

  • Hai lệnh SELECT phải có cùng số biểu thức.
  • Cột tương ứng trong mỗi lệnh SELECT phải có cùng kiểu dữ liệu.
  • Toán tử INTERSECT chỉ trả về bản ghi nằm chung giữa các lệnh SELECT.

Ví dụ - với 1 biểu thức

SELECT sanpham_id
FROM sanpham
INTERSECT
SELECT sanpham_id
FROM hangtonkho;

Ở ví dụ này, nếu sanpham_id xuất hiện ở cả bảng sanpham và hangtonkho thì nó sẽ nằm trong bộ kết quả của INTERSECT.

Giờ hãy thêm điều kiện WHERE vào truy vấn này.

SELECT sanpham_id
FROM sanpham
WHERE sanpham_id >= 50
INTERSECT
SELECT sanpham_id
FROM hangtonkho
WHERE soluong > 0;

Bộ dữ liệu thứ 1 sẽ lọc và trả về các bản ghi nằm trong bảng sanpham và sanpham_id lớn hơn hoặc bằng 50. Bộ dữ liệu thứ 2 sẽ lọc lấy từ bảng hangtonkho nếu số lượng lớn hơn 0.

Ví dụ - với nhiều biểu thức

SELECT danhba_id, ho, ten
FROM danhba
WHERE ho = ‘Anderson’
INTERSECT
SELECT nhanvien_id, ho, ten
FROM nhanvien;

Ở ví dụ này, truy vấn sẽ trả về kết quả giao nhau từ 2 lệnh SELECT. Nếu có bản ghi trong bảng danhba mà danhba_id, ho, ten trùng với nhanvien_id, ho, ten trong bảng nhanvien thì truy vấn INTERSECT sẽ trả về các bản ghi đó.

Ví dụ - dùng ORDER BY

Dùng mệnh đề ORDER BY với truy vấn INTERSECT để sắp xếp kết quả.

SELECT nhacung_id, nhacung_ten
FROM nhacung
WHERE nhacung_id > 500
INTERSECT
SELECT congty_id, congty_ten
FROM congty
WHERE congty_ten in (‘Apple’, ‘Microsoft’, ‘SQL Server’)
ORDER BY 2;

Vì tên cột ở 2 lệnh SELECT khác nhau nên sẽ dễ hơn nếu tham chiếu tới cột trong mệnh đề ORDER BY bằng vị trí của chúng trong bộ kết quả. Ở ví dụ trên, ta lọc kết quả nhacung_ten / congty_ten theo thứ tự tăng dần qua cụm từ ORDER BY 2.

Vì nhacung_ten / congty_ten đứng thứ 2 trong bộ kết quả.

Bài trước: Toán tử UNION ALL trong SQL Server

Bài sau: Toán tử EXCEPT trong SQL Server

0