SELECT COUNT(a.log_id) AS overall_count FROM "Log" as a,"License" as b WHERE a.license_id=7 AND a.license_id=b.license_id AND b.limit_call > overall_count GROUP BY a.license_id;
为什么我得到这个错误:
ERROR: column “overall_count” does not exist
我的桌面结构:
License(license_id,license_name,limit_call,create_date,expire_date) Log(log_id,license_id,log,call_date)
我想检查一个许可证是否达到了特定月份的通话限制。
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)
要点
>在Postgresql 9.1之前的版本中,您必须向GROUP BY子句添加limit_call。
从版本9.1开始,在GROUP BY子句中具有主键就足够了。 release notes for 9.1告诉我们:
Allow non-
GROUP BY
columns in the query target list when the primary
key is specified in theGROUP BY
clause
>我颠倒了你的表在查询中出现的顺序,并清理了一些语法,使它不那么混乱。使用在这里只是一个标志性的方便。
>我使用LEFT JOIN而不是JOIN,所以你不排除没有任何日志的许可证。
>您的WHERE条件必须移动到HAVING子句,因为您引用聚合函数的结果。而您不能在HAVING子句中引用输出列(列别名),您只能引用输入列。所以你必须重复表达。 Per documentation:
An output column’s name can be used to refer to the column’s value in
ORDER BY
andGROUP BY
clauses,but not in theWHERE
orHAVING
clauses;
there you must write out the expression instead.
>如果可能,我建议不要在Postgres中使用mixed case identifiers。很容易出错> count()只计算非空值。因为你想计数相关条目int表“日志”,使用count(b.license_id)更安全,更便宜一点。该列在连接中使用,因此我们不必打扰列是否为空。count(*)会更短,稍快一点。如果在左侧表格中为0行计数为1,则我将使用它。