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 BY
trong danh sách đích truy vấn khi khóa chính được chỉ định trongGROUP BY
mệ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 BY
vàGROUP BY
các mệnh đề, nhưng không có trongWHERE
hoặ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.