我有这样的查询:
select foo.*, count(bar.id)
from foo inner join bar on foo.id = bar.foo_id
group by foo.id
Run Code Online (Sandbox Code Playgroud)
这适用于SQLite和MySQL.然而,Postgres抱怨我不包括group by条款中的所有foo列.为什么是这样?foo.id是独一无二的还不够吗?
a_h*_*ame 33
以防万一其他人偶然发现这个问题:
从PostgreSQL 9.1开始,在group by子句中列出主键的列就足够了(因此问题中的示例现在可以使用).
某些数据库对此有所放松,无论好坏。查询是不确定的,因此结果同样是不确定的。如果数据库允许查询,它将从每个组中返回一条记录,并且不在乎哪一条。其他数据库更具体,需要您从组中指定要使用的值。他们不会让您编写查询结果不确定的查询。
在没有聚合的情况下,唯一可以选择的值是group by子句中的值:
select foo.id, count(bar.id)
from foo inner join bar on foo.id = bar.foo_id
group by foo.id
Run Code Online (Sandbox Code Playgroud)
您可以使用聚合来获取其他值:
select foo.id, min(foo.price), count(bar.id)
from foo inner join bar on foo.id = bar.foo_id
group by foo.id
Run Code Online (Sandbox Code Playgroud)
如果要从foo表中获取所有值,则可以将它们全部放在group by子句中(如果给出正确的结果):
select foo.id, foo.price, foo.name, foo.address, count(bar.id)
from foo inner join bar on foo.id = bar.foo_id
group by foo.id, foo.price, foo.name, foo.address
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用子查询将表联接:
select foo.id, foo.price, foo.name, foo.address, sub.bar_count
from foo
inner join (
select foo.id, bar_count = count(bar.id)
from foo inner join bar on foo.id = bar.foo_id
group by foo.id
) sub on sub.id = foo.id
Run Code Online (Sandbox Code Playgroud)