您对规则的理解
GROUP BY
是
几乎
完成通常
SELECT
子句也必须出现在
分组依据
然而,ANSI标准中有一个例外,它规定如果
分组依据
哪一个
独特地
确定其他列的值,则这些其他列也可以出现在
选择
条款
仔细查看您的第二个查询:
SELECT group_name, AVG(price) -- valid, because if we know
FROM product_groups -- group_id then we also know
INNER JOIN products p USING (group_id) -- group_name
GROUP BY group_id;
在
products
表,如果
group_id
要么是主键,要么是唯一键,那么如果我们为
group_id
,我们也知道
group_name
如果是的话,那么从技术上讲,您的第二个查询是符合ANSI的。与大多数其他数据库相比,Postgres更倾向于严格遵循ANSI标准,因此它接受您的查询是有效的。