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)
从 Postgres 9.1 开始,主键涵盖了表中的所有列GROUP BY
条款。在旧版本中你必须添加a.limit_call
to the GROUP BY
列表。这9.1 的发行说明 https://www.postgresql.org/docs/current/release-9-1.html:
允许非GROUP BY
主查询时查询目标列表中的列
键指定在GROUP BY
clause
进一步阅读:
- 当我按键聚合时,为什么无法从“GROUP BY”中排除依赖列? https://stackoverflow.com/questions/62095987/why-cant-i-exclude-dependent-columns-from-group-by-when-i-aggregate-by-a-key
您当时的情况WHERE
条款必须移至HAVING
子句,因为它引用聚合函数的结果 (after WHERE
已应用)。并且你不能参考输出列(列别名)在HAVING
子句,您只能在其中引用输入列。所以你必须重复这个表达。手册: https://www.postgresql.org/docs/current/sql-select.html#SQL-SELECT-LIST
输出列的名称可用于引用该列的值ORDER BY
and GROUP BY
条款,但不在WHERE
or HAVING
条款;在那里你必须写出表达式。
我颠倒了表中的顺序FROM
子句并稍微清理了语法以使其不那么混乱。USING
这里只是为了符号方便。
I used LEFT JOIN
代替JOIN
,因此您根本不排除没有任何日志的许可证。
仅对非空值进行计数count()
。既然你想数数相关条目在表中"Log"
使用起来更安全且稍微便宜count(b.license_id)
。该列用于连接,因此我们不必担心该列是否可以为空。
count(*)
甚至更短、更快。如果你不介意计算一下1
for 0
左表中的行,使用它。
旁白:我建议not to use 混合大小写标识符 https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS如果可能的话,在 Postgres 中。非常容易出错。