Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite上的Fine,Postgresql中的Breaked:列必须出现在GROUP BY子句中,或在聚合函数中使用_Postgresql_Sqlite - Fatal编程技术网

SQLite上的Fine,Postgresql中的Breaked:列必须出现在GROUP BY子句中,或在聚合函数中使用

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

我有一个在SQLite上运行良好的查询,但是当我在Postgresql中的相同数据上运行它时,我得到:

列“role.id”必须出现在GROUP BY子句中,或在聚合函数中使用

我有三张桌子,用于人、展览,还有一张桌子将两者联系起来:“一个人在一个展览中扮演一个特定的角色”(如“艺术家”或“策展人”):

我想展示参与展览的人员,他们做了多少事情。因此,我获取了一个展览中人们的ID(
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被破坏了。这种
分组方式是无效和错误的。