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

Tôi có kết quả khác với truy vấn cho COUNT ('e.id') hoặc COUNT (e.id)

'e.id' là một hằng số chuỗi, vì vậy COUNT('e.id') chỉ là một cách nói khó hiểu, gây hiểu lầm COUNT(*) .

COUNT(e.id) mặt khác, đếm tất cả các hàng trong kết quả mà e.id IS NOT NULL - kể từ khi count() không tính giá trị NULL.

Hướng dẫn về count() :

Như bạn có thể thấy, thậm chí có hai chức năng riêng biệt bên trong. Và cần lưu ý rằng count(*) nhanh hơn một chút. Vì vậy, hãy sử dụng nó trừ khi bạn cần biến thể thứ hai. Có liên quan:

Bạn có thể phản đối bằng:
"Nhưng e.idPRIMARY KEY trong tổng số core_employments , vì vậy nó được định nghĩa NOT NULL ! "

Nhưng điều đó sẽ bỏ qua LEFT JOIN có điều kiện trong truy vấn của bạn vẫn giới thiệu NULL các giá trị trong NOT NULL của bạn cột, nơi các điều kiện tham gia không được đáp ứng. Có liên quan:

Điều đó nói rằng, LEFT [OUTER] JOIN cũng gây hiểu lầm. Điều kiện sau

having("COUNT(e.id) = 1")

buộc nó hoạt động như một [INNER] JOIN đơn giản . Khi bạn đã khắc phục điều đó, bạn cũng có thể đơn giản hóa thành:

having("COUNT(*) = 1")

Và nếu tất cả những gì bạn quan tâm là ít nhất là một hàng có liên quan tồn tại trong core_employments , đang dịch sang having("COUNT(*) >= 1") , kỹ thuật ưu việt (rõ ràng hơn, nhanh hơn) trong các trường hợp đơn giản sẽ là EXISTS bán tham gia :

WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Việc thêm các bảng không liên quan trong mệnh đề WITH có làm chậm truy vấn trong PostgreSQL không?

  2. Thay đổi giá trị bắt đầu của một chuỗi - Postgresql

  3. Hibernate + PostgreSQL + Loại địa chỉ mạng (inet, cdir)

  4. Việc gọi hàm hoặc thủ tục đã lưu trữ sẽ không chèn và vẫn tiếp tục các thay đổi

  5. Cách kết nối với cơ sở dữ liệu Heroku postgres từ kết nối cục bộ trong php