【问题标题】:PostgreSql: cannot use aggregate function in UPDATEPostgreSql:不能在 UPDATE 中使用聚合函数
【发布时间】:2014-10-07 21:36:44
【问题描述】:

我有一个移植到 PostgreSql 的 Oracle 查询:

UPDATE "SPD_PG"."TT_SPLDR_11A2F324_29" 
SET "SECT_ORDER" = MAX("SECTIONS"."SECT_ORDER")+1 FROM "SPD_PG"."SECTIONS"
INNER JOIN "SPD_PG"."META_SECTIONS" ON ("SECTIONS"."META_SECT_ID"="META_SECTIONS"."META_SECT_ID")
WHERE ("META_SECTIONS"."META_SECT_ORDER"="TT_SPLDR_11A2F324_29"."META_SECT_ORDER"-1)
AND ("SECTIONS"."DOC_ID"="TT_SPLDR_11A2F324_29"."DOC_ID")
AND ("TT_SPLDR_11A2F324_29"."META_SECT_ORDER">0)

这给我:ERROR: cannot use aggregate function in UPDATE,好像 PostgreSql 不支持更新语句中的MAX

但是,如果我将查询重写如下:

UPDATE "SPD_PG"."TT_SPLDR_11A2F324_29" 
SET "SECT_ORDER" = "MAX_VALUE" FROM (
  SELECT MAX("SECTIONS"."SECT_ORDER")+1 AS "MAX_VALUE" FROM "SPD_PG"."SECTIONS"
  INNER JOIN "SPD_PG"."META_SECTIONS" ON ("SECTIONS"."META_SECT_ID"="META_SECTIONS"."META_SECT_ID")
  WHERE ("META_SECTIONS"."META_SECT_ORDER"="TT_SPLDR_11A2F324_29"."META_SECT_ORDER"-1)
  AND ("SECTIONS"."DOC_ID"="TT_SPLDR_11A2F324_29"."DOC_ID")
  AND ("TT_SPLDR_11A2F324_29"."META_SECT_ORDER">0)
) "TBL_ALIAS"

上面写着ERROR: subquery in FROM cannot refer to other relations of same query level

所以我不知道如何编写这个查询。

【问题讨论】:

  • 我认为您的第二个版本应该适用于 postgresql 9.3。
  • @Eelke 对不起,我忘了说明我在 9.1

标签: postgresql sql-update aggregate-functions


【解决方案1】:

试试这个:

UPDATE "SPD_PG"."TT_SPLDR_11A2F324_29" 
   SET "SECT_ORDER" = (SELECT MAX("SECTIONS"."SECT_ORDER")+1 
                         FROM "SPD_PG"."SECTIONS"
                        INNER JOIN "SPD_PG"."META_SECTIONS" ON ("SECTIONS"."META_SECT_ID"="META_SECTIONS"."META_SECT_ID")
                        WHERE ("META_SECTIONS"."META_SECT_ORDER"="TT_SPLDR_11A2F324_29"."META_SECT_ORDER"-1)
                          AND ("SECTIONS"."DOC_ID"="TT_SPLDR_11A2F324_29"."DOC_ID")
                          AND ("TT_SPLDR_11A2F324_29"."META_SECT_ORDER">0)
                      )

【讨论】:

  • 谢谢,它有效。我想如果我要设置超过 1 个值,我将不得不为每个值重复子查询......?
  • 是的,您需要对每个值重复此子查询。但是在表中存储聚合值是一个坏主意。你听说过标准化吗?如果我是你,我会使用视图。
  • 这是一个在数据库中加载配置的批处理过程。我需要对已经存在的数据进行一些调整,并且我需要 MAX("SECT_ORDER") 用于特定的 DOC_ID(想想 Excel 中的工作表)。
  • 顺便说一句,我发现 SQLServer (2008 R2) 在更新语句中的聚合函数存在同样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 2021-11-27
  • 2013-08-29
相关资源
最近更新 更多