SELECT a.license_id, a.limit_call
, count(b.license_id) AS overall_count
FROM "License" a
LEFT JOIN "Log" b USING (license_id)
WHERE a.license_id = 7
GROUP BY a.license_id -- , a.limit_call -- add in old versions
HAVING a.limit_call > count(b.license_id)
Vì Postgres 9.1, khóa chính bao gồm tất cả các cột của bảng trong GROUP BY mệnh đề. Trong các phiên bản cũ hơn, bạn phải thêm a.limit_call vào GROUP BY danh sách. Các ghi chú phát hành cho 9.1:
Cho phép không phải
GROUP BYtrong danh sách đích truy vấn khi khóa chính được chỉ định trongGROUP BYmệnh đề
Đọc thêm:
- Tại sao tôi không thể loại trừ các cột phụ thuộc khỏi `GROUP BY` khi tôi tổng hợp theo một khóa?
Điều kiện bạn có trong WHERE mệnh đề phải chuyển đến HAVING mệnh đề vì nó đề cập đến kết quả của một hàm tổng hợp ( sau WHERE đã được áp dụng). Và bạn không thể tham chiếu đến cột đầu ra (bí danh cột) trong HAVING mệnh đề, nơi bạn chỉ có thể tham chiếu các cột đầu vào. Vì vậy, bạn phải lặp lại biểu thức. Hướng dẫn sử dụng:
Tên của cột đầu ra có thể được sử dụng để tham chiếu đến giá trị của cột trong
ORDER BYvàGROUP BYcác mệnh đề, nhưng không có trongWHEREhoặcHAVINGđiều khoản; ở đó bạn phải viết ra biểu thức để thay thế.
Tôi đã đảo ngược thứ tự của các bảng trong FROM và làm sạch cú pháp một chút để làm cho nó bớt khó hiểu hơn. USING chỉ là một sự tiện lợi về mặt lưu ý ở đây.
Tôi đã sử dụng LEFT JOIN thay vì JOIN , vì vậy bạn không loại trừ giấy phép mà không có bất kỳ nhật ký nào.
Chỉ các giá trị không rỗng mới được tính bằng count() . Vì bạn muốn đếm mục nhập có liên quan trong bảng "Log" an toàn hơn và rẻ hơn một chút khi sử dụng count(b.license_id) . Cột này được sử dụng trong phép nối, vì vậy chúng ta không phải bận tâm xem cột có thể rỗng hay không.
count(*) thậm chí còn ngắn hơn và nhanh hơn một chút. Nếu bạn không phiền hãy đếm 1 cho 0 các hàng trong bảng bên trái, hãy sử dụng.
Bên cạnh:Tôi sẽ khuyên không để sử dụng số nhận dạng chữ hoa chữ thường hỗn hợp trong Postgres nếu có thể. Rất dễ xảy ra lỗi.