Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chỉ trả lại hàng nếu giá trị không tồn tại

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa hàng bằng MySQL LEFT JOIN

  2. MySQL - Kết hợp giữa các cơ sở dữ liệu trên các máy chủ khác nhau bằng Python?

  3. MySQL so với PDO

  4. Cách triển khai Percona XtraDB Cluster 8 để có tính khả dụng cao

  5. Mất kết nối với máy chủ MySQL trong khi truy vấn