mysql与pgsql升级转换_关于sql:将MySQL选择转换为PostgreSQL

在将一个在MySQL中正常工作的查询移植到PostgreSQL时,遇到错误提示‘column must appear in the GROUP BY clause or be used in an aggregate function’。问题在于PostgreSQL要求在GROUP BY子句中明确列出SELECT中的所有非聚合列。解决方案是在GROUP BY子句中添加缺失的列,如‘c.id, c.name’。讨论还包括了MySQL对此的宽松处理和可能产生的不确定性。" 112693641,10535248,Windows开发环境搭建:Chocolatey与Scoop包管理器详解,"['Windows开发', '包管理', 'Chocolatey', 'Scoop', 'Aria2']
摘要由CSDN通过智能技术生成

我有此查询在MySQL中正常工作。 这里有更多背景信息。

SELECT c.*, SUM(ABS(v.vote)) AS score

FROM categories c,items i, votes v

WHERE c.id = i.category_id

AND i.id = v.voteable_id

AND v.created_at > '#{1.week.ago}'

GROUP BY c.id

ORDER BY score DESC LIMIT 8;

我尝试在PostgreSQL中运行它,但此错误消息失败。

PGError: ERROR: column"c.name" must

appear in the GROUP BY clause or be

used in an aggregate function

我不知道这是什么意思,所以我尝试在group by子句中将" c.id"更改为" c.name"(在MySQL中两者都是相同的,假定项的名称是唯一的)。

但是,这又产生了另一个类似的错误

PGError: ERROR: column"c.id" must

appear in the GROUP BY clause or be

used in an aggregate function

该问题如何解决?

奇怪的是,Postgre 9.1现在似乎允许这样做

它在Postgre 9.2中被删除了吗? 出于相同的原因,我收到此错误。

@Aaron:它没有被删除,但是仅在(引用文档)时才起作用:ungrouped列在功能上取决于grouped列,因为否则,对于ungrouped列,可能有多个可能的值返回。 如果分组的列(或其子集)是包含未分组的列的表的主键,则存在功能依赖性

您必须在要分组的SELECT中列出列名:

SELECT c.id, c.name, SUM(ABS(v.vote)) AS score

FROM categories c,items i, votes v

WHERE c.id = i.category_id

AND i.id = v.voteable_id

AND v.created_at > '#{1.week.ago}'

GROUP BY c.id, c.name

ORDER BY score DESC LIMIT 8;

"不允许在SELECT子句中包括GROUP BY子句中未引用的列名。"

它在MySQL中是允许的,这就是为什么他感到困惑。 我认为这很可怕

我只是遇到了这个问题,但是从MySQL转到SQL Server。我认为允许的事实很奇怪!

是的,在大多数数据库中,当您具有GROUP BY子句时,您只能选择显示在GROUP BY子句中的一个或多个列的集合。这是因为它无法知道您选择的其他列是否真正唯一。

如果确实需要,只需将所需的列放在GROUP BY中即可。这是MySQL的"功能",值得商question。

您可以在此处阅读有关MySQL的行为及其区别的信息。

例:

SELECT c.*, SUM(ABS(v.vote)) AS score

FROM categories c,items i, votes v

WHERE c.id = i.category_id

AND i.id = v.voteable_id

AND v.created_at > '#{1.week.ago}'

GROUP BY c.id, c.name, c.whatever_else

ORDER BY score DESC LIMIT 8;

感谢MySQL链接,现在更有意义了! 在这种情况下,我的c.id始终是唯一的,因此可能还可以,但是至少我现在知道他们为什么这样做了。 谢谢!

如果将您的声明更改为此,它应该起作用:

SELECT c.id, SUM(ABS(v.vote)) AS score

FROM categories c,items i, votes v

WHERE c.id = i.category_id

AND i.id = v.voteable_id

AND v.created_at > '#{1.week.ago}'

GROUP BY c.id

ORDER BY score DESC LIMIT 8;

我不确定MySQL会给出什么结果,但是给你一个很小的例子,为什么它在PostgreSQL中不起作用,请看下面的categories表:

id | name

---|-----

1 | ABC

1 | DEF

您按id分组,因此结果中的每一行应仅包含一个id。如果还选择name,但未按其分组,则name的结果应显示什么?

它可以是ABC或DEF,但是数据库引擎无法真正为您决定(尽管MySQL显然可以做到)。

MySQL随机选择一个! 奇怪吗? 几天前我问了一个问题。

有趣的是……在这种情况下,至少我的ID始终是唯一的,因此这是一个很好的分组依据。 我也需要类别的名称,因此我只在选择和分组依据中列出了。 似乎可以工作。 谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值