Điều kiện EXISTS trong SQL Server

Trong SQL Server (Transact-SQL) điều kiện EXISTS được dúng để kết hợp với truy vấn nội bộ (subquery). Điều kiện được đáp ứng nếu truy vấn nội bộ trả về ít nhất 1 hàng. Điều kiện này có thể dùng trong lệnh SELECT, INSERT, UPDATE hoặc DELETE.

Cú pháp mệnh đề EXISTS trong SQL Server

WHERE EXISTS ( subquery);

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

subquery

Subquery – truy vấn nội bộ là một lệnh SELECT. Nếu truy vấn này trả về ít nhất 1 bản ghi trong bộ kết quả thì mệnh đề EXISTS được đánh giá là đúng và điều kiện EXISTS được đáp ứng. Nếu truy vấn nội bộ không trả về bản ghi nào, mệnh đề EXISTS được đánh giá là sai và điều kiện EXISTS không được đáp ứng.

Lưu ý

Sử dụng điều kiện EXISTS không hiệu quả do truy vấn nội bộ RE-RUN (chạy lại) trên mỗi hàng trong bảng ở truy vấn ngoài. Có nhiều cách hiệu quả hơn mà không cần dùng điều kiện EXISTS.

Ví dụ – với lệnh SELECT

Lệnh SELECT dùng với điều kiện EXISTS như dưới đây.

SELECT *  FROM nhanvien WHERE EXISTS (SELECT *                FROM danhba               WHERE nhanvien.ho = danhba.ho               AND nhanvien.ten = danhba.ten);

Ví dụ này sẽ trả về tất cả các bản ghi từ bảng nhanvien khi có ít nhất 1 bảng ghi trong bảng danhba có họ và tên khớp với họ và tên trong bảng nhanvien.

Ví dụ – lệnh SELECT dùng NOT EXISTS

Điều kiện EXISTS có thể kết hợp với toán tử NOT.

SELECT *  FROM nhanvien WHERE NOT EXISTS (SELECT *                   FROM danhba                   WHERE nhanvien.ho = danhba.ho                   AND nhanvien.ten = danhba.ten);

Kết quả trả về là tất cả các bản ghi trong bảng nhanvien nếu không có bản ghi họ và tên nào trong bảng danhba khớp với họ và tên trong bảng nhanvien.

Ví dụ – lệnh INSERT

Đây là ví dụ dùng lệnh INSERT với điều kiện EXISTS

INSERT INTO danhba (danhba_id, danhba_ten) SELECT nhacung_id, nhacung_ten FROM nhacung WHERE EXISTS (SELECT *                FROM donhang               WHERE nhacung.nhacung_id = donhang.nhacung_id);

Ví dụ – lệnh UPDATE

Dưới đây là ví dụ lệnh UPDATE dùng điều kiện EXISTS.

UPDATE nhacung SET nhacung_ten = (SELECT khachhang.ten                    FROM khachhang                    WHERE khachhang.khachhang_id = nhacung.nhacung_id) WHERE EXISTS (SELECT khachhang.ten               FROM khachhang               WHERE khachhang.khachhang_id = nhacung.nhacung_id);

Ví dụ – lệnh DELETE

Lệnh DELETE cũng có thể dùng với điều kiện EXISTS như dưới đây.

DELETE FROM danhba WHERE EXITS (SELECT *               FROM nhanvien              WHERE nhanvien.ho = danhba.ho );