SELECT *
FROM reservation
WHERE id NOT IN (select reservation_id
FROM reservation_log
WHERE change_type = 'cancel')
HOẶC:
SELECT r.*
FROM reservation r
LEFT JOIN reservation_log l ON r.id = l.reservation_id AND l.change_type = 'cancel'
WHERE l.id IS NULL
Phiên bản đầu tiên trực quan hơn, nhưng tôi nghĩ rằng phiên bản thứ hai thường có hiệu suất tốt hơn (giả sử bạn có chỉ mục trên các cột được sử dụng trong phép nối).
Phiên bản thứ hai hoạt động vì LEFT JOIN
trả về một hàng cho tất cả các hàng trong bảng đầu tiên. Khi ON
điều kiện thành công, các hàng đó sẽ bao gồm các cột từ bảng thứ hai, giống như INNER JOIN
. Khi điều kiện không thành công, hàng trả về sẽ chứa NULL
cho tất cả các cột trong bảng thứ hai. WHERE l.id IS NULL
sau đó kiểm tra đối sánh các hàng đó, vì vậy nó tìm thấy tất cả các hàng không khớp giữa các bảng.