SQLite上的Fine,Postgresql中的Breaked:列必须出现在GROUP BY子句中,或在聚合函数中使用
我有一个在SQLite上运行良好的查询,但是当我在Postgresql中的相同数据上运行它时,我得到: 列“role.id”必须出现在GROUP BY子句中,或在聚合函数中使用 我有三张桌子,用于人、展览,还有一张桌子将两者联系起来:“一个人在一个展览中扮演一个特定的角色”(如“艺术家”或“策展人”): 我想展示参与展览的人员,他们做了多少事情。因此,我获取了一个展览中人们的ID(SQLite上的Fine,Postgresql中的Breaked:列必须出现在GROUP BY子句中,或在聚合函数中使用,postgresql,sqlite,Postgresql,Sqlite,我有一个在SQLite上运行良好的查询,但是当我在Postgresql中的相同数据上运行它时,我得到: 列“role.id”必须出现在GROUP BY子句中,或在聚合函数中使用 我有三张桌子,用于人、展览,还有一张桌子将两者联系起来:“一个人在一个展览中扮演一个特定的角色”(如“艺术家”或“策展人”): 我想展示参与展览的人员,他们做了多少事情。因此,我获取了一个展览中人们的ID(1,2,3,4),然后执行以下操作: SELECT *, COUNT(person.id) AS r
1,2,3,4
),然后执行以下操作:
SELECT
*,
COUNT(person.id) AS role_count
FROM person
INNER JOIN role
ON person.id = role.person_id
WHERE person.id IN ( 1, 2, 3, 4 )
GROUP BY person.id
ORDER BY role_count DESC
通过role\u count
对人员进行排序,这是他们在所有展览中扮演的角色数
它在SQLite上运行良好,但在Postgresql中不起作用。我试着将
role.id
加入组,但结果会发生变化。你知道,当你挣扎了很久之后,发布一个SO问题,然后立即找到答案吗
从那时起,我意识到我无法选择role.id
(这是select*
隐式执行的操作),因为它不在组中
我无法通过
将其添加到组(因为这会更改结果),因此解决方案是不选择它
因此,我将SELECT
部分更改为:
SELECT
person.*,
COUNT(person.id) AS role_count
FROM person
...
现在未选择role.id
。这就行了
如果我需要角色
表中的任何其他字段,如名称
,我也可以显式添加这些字段:
SELECT
person.*,
role.name,
COUNT(person.id) AS role_count
FROM person
...
你知道吗,当你挣扎了很久,贴出一个问题,然后立刻发现答案
从那时起,我意识到我无法选择role.id
(这是select*
隐式执行的操作),因为它不在组中
我无法通过
将其添加到组(因为这会更改结果),因此解决方案是不选择它
因此,我将SELECT
部分更改为:
SELECT
person.*,
COUNT(person.id) AS role_count
FROM person
...
现在未选择role.id
。这就行了
如果我需要角色
表中的任何其他字段,如名称
,我也可以显式添加这些字段:
SELECT
person.*,
role.name,
COUNT(person.id) AS role_count
FROM person
...
正如错误所说,标准SQL不允许您选择除GROUP BY
列或调用。(出于逻辑原因:当一个组中有多行可供选择时,RDBMS如何知道选择哪个role.id
);SQLite忽略它,只从组中的任意行返回数据
正如您所发现的,从选择中省略role.id
可以修复错误。但是如果您确实想要SQLite从任意行中选择ID的行为,您可以简单地将其包装在聚合函数中,例如,SELECT MAX(role.ID)
,而不仅仅是SELECT role.ID
)。就像错误所说的那样,标准SQL不允许您选择除GROUP BY
列之一或调用。(出于逻辑原因:当一个组中有多行可供选择时,RDBMS如何知道选择哪个role.id
);SQLite忽略它,只从组中的任意行返回数据
正如您所发现的,从选择中省略role.id
可以修复错误。但是,如果您确实想要SQLite从任意行中选择ID的行为,您可以简单地将其包装在聚合函数中,例如,SELECT MAX(role.ID)
,而不仅仅是SELECT role.ID
)。实际上相反:SQLite被破坏了。这种groupby
是无效的,也是错误的。事实上,情况正好相反:SQLite被破坏了。这种分组方式是无效和错误的。