Toán tử EXCEPT trong SQL Server

Toán tử EXCEPT trong SQL Server được dùng để trả về các hàng trong lệnh SELECT đầu tiên mà không trả về trong lệnh SELECT thứ hai. Mỗi lệnh SELECT sẽ có một bộ dữ liệu. Toán tử EXCEPT lấy bản ghi từ bộ thứ 1 và bỏ các kết quả từ bộ 2.

Truy vấn EXCEPT


Minh họa truy vấn EXCEPT

Giải thích: Truy vấn EXCEPT trả về bản ghi trong khu vực màu xanh, chỉ nằm trong bộ dữ liệu 1 và không nằm trong bộ dữ liệu 2.

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

Cú pháp toán tử EXCEPT

SELECT bieu_thuc1, bieu_thuc2,  bieu_thucn FROM bang [WHERE dieu_kien] EXCEPT 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ử EXCEPT trả về tất cả bản ghi từ lệnh SELECT đầu tiên và không nằm trong lệnh SELECT thứ 2.
  • Toán tử EXCEPT trong SQL Server tương đương với toán tử MINUS trong Oracle.

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

SELECT sanpham_id FROM sanpham EXCEPT  SELECT sanpham_id FROM hangtonkho;

Ở ví dụ với toán tử EXCEPT này, kết quả trả về tất cả các giá trị sanpham_id nằm trong bảng sanpham và không nằm trong bảng hangtonkho. Nghĩa là nếu giá trị sanpham_id nào có ở cả 2 bảng thì sẽ không được trả về.

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

SELECT danhba_id, ho, ten FROM danhba WHERE ho = Anderson EXCEPT  SELECT nhanvien_id, ho, ten FROM nhanvien;

Ở ví dụ này, truy vấn trả về các bản ghi trong bảng danhba với ID của số liên lạc, họ và tên không trùng với ID, họ và tên của nhân viên trong bảng nhanvien.

Ví dụ – dùng mệnh đề ORDER BY

SELECT nhacung_id, nhacung_ten FROM nhacung WHERE bang = Florida EXCEPT SELECT congty_id, congty_ten FROM congty WHERE congty_id <= 400 ORDER BY 2;

Trong ví dụ này, do tên cột ở 2 lệnh SELECT khác nhau nên sẽ dễ hơn khi tham chiếu tới cột bằng mệnh đề ORDER BY qua vị trí 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ả.