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

SQL:Chọn các bản ghi trong đó TẤT CẢ các bản ghi được kết hợp thỏa mãn một số điều kiện

Giả sử không cần tương quan, hãy sử dụng:

SELECT a.*
  FROM A a
 WHERE EXISTS(SELECT NULL
                FROM B b
              HAVING MIN(b.some_val) > a.val)

Nếu bạn cần sự tương quan:

SELECT a.*
  FROM A a
 WHERE EXISTS(SELECT NULL
                FROM B b
               WHERE b.id = a.id
              HAVING MIN(b.some_val) > a.val)

Giải thích

EXISTS đánh giá trên boolean, dựa trên so khớp đầu tiên - điều này làm cho nó nhanh hơn so với sử dụng IN và - không giống như sử dụng JOIN - sẽ không trùng lặp các hàng. Phần CHỌN không quan trọng - bạn có thể thay đổi nó thành EXISTS SELECT 1/0 ... và truy vấn sẽ vẫn hoạt động mặc dù có lỗi phân chia rõ ràng bằng 0.

Truy vấn con trong EXISTS sử dụng hàm tổng hợp MIN để nhận B.some_val nhỏ nhất - nếu giá trị đó lớn hơn giá trị a.val, thì a.val nhỏ hơn tất cả các giá trị b. Chỉ cần một WHERE mệnh đề tương quan - chỉ có thể sử dụng các hàm tổng hợp trong HAVING mệnh đề.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fluent NHibernate và PostgreSQL, SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException:Không hỗ trợ phương pháp đã chỉ định

  2. Làm thế nào để làm mới các thực thể JPA khi cơ sở dữ liệu phụ trợ thay đổi không đồng bộ?

  3. Tên quy trình PostgreSQL trên Solaris

  4. Chèn dữ liệu vào 3 bảng cùng một lúc bằng Postgres

  5. Cải tiến phân vùng trong PostgreSQL 11