SQLite可用的GROUP BY查询在PostgreSQL中执行报错求助
问题原因
PostgreSQL严格遵循ANSI SQL标准,要求SELECT子句里的非聚合函数列必须要么出现在GROUP BY子句中,要么被聚合函数(比如MAX()、MIN())包裹。而SQLite默认启用了宽松模式,允许这种“不严谨”的写法——它会自动选取分组内的任意值返回,但这其实存在逻辑风险(比如如果同一cards.did对应多个不同的decks.id/name,结果会不可预测)。
你的查询里,decks.id和decks.name既不在GROUP BY里,也没被聚合函数处理,所以PostgreSQL直接触发报错。
解决方案
因为decks.id = cards.did,每个cards.did分组对应的decks.id和decks.name应该是唯一的(假设decks.id是表主键),所以只需要把这两个列加入GROUP BY即可:
SELECT decks.id, decks.name, count(cards.id) FROM decks JOIN cards ON decks.id = cards.did GROUP BY decks.id, decks.name;
如果decks.id是decks表的主键,PostgreSQL还支持更简洁的写法(利用主键唯一性,只需GROUP BY主键,其他依赖列可省略):
SELECT decks.id, decks.name, count(cards.id) FROM decks JOIN cards ON decks.id = cards.did GROUP BY decks.id;
这两种写法都符合PostgreSQL的标准要求,同时能保证结果逻辑正确。
内容的提问来源于stack exchange,提问作者Ranjith kumar
相关产品推荐
相关产品推荐

