【问题标题】:ERROR: more than one row returned by a subquery used as an expression when updating field错误:更新字段时用作表达式的子查询返回多行
【发布时间】:2021-11-23 07:27:25
【问题描述】:

我有一个表,对于相同的 ID,我有不同的信息。例如。

ID Activity
1 12
1 15
2 15
3 20

我想更新“活动”字段,将每个 id 的所有不同活动值合并为一行。

当我使用以下代码进行选择时,我想要的是:

SELECT string_agg(id_epigrafe, ', ') AS epigrafe_list
                FROM   febrero20_2
                GROUP  BY id_local;

结果是:

但是,当我想在我的更新查询 posgresql(版本 13)中引入该查询时,会出现以下错误:错误:用作表达式的子查询返回的不止一行。 我用来尝试更新字段的代码是:

UPDATE febrero20_2
SET id_epigrafe = (SELECT string_agg(id_epigrafe, ', ') AS epigrafe_list
                FROM   febrero20_2
                GROUP  BY id_local);

我尝试创建一个新表,在这种情况下,我可以使用以下代码正确完成:

CREATE TABLE febrero20_3
AS
SELECT id_local, string_agg(id_epigrafe, ', ') AS epigrafe_list
FROM   febrero20
GROUP BY id_local
ORDER BY id_local;

谁能帮我理解为什么会出现这个错误?我是 posgresql 的新手,因此,如果这只是一些简单的错误,我很抱歉,但我找不到任何答案

【问题讨论】:

    标签: sql postgresql sql-update


    【解决方案1】:

    您必须将更新的表与从中获取值的表连接起来,这样您就不会得到一个包含多个结果行的子查询:

    UPDATE febrero20_2 AS f_1
    SET id_epigrafe = f_2.epigrafe_list
    FROM (SELECT id_local,
                 string_agg(id_epigrafe, ', ') AS epigrafe_list
          FROM   febrero20_2
          GROUP  BY id_local) AS f_2
    WHERE f_1.id_local = f_2.id_local;
    

    让我指出,这似乎是一个奇怪的说法:你实质上是在破坏信息。从表中查询时执行这样的聚合不是更好吗?

    【讨论】:

    • 谢谢!但是,您的解决方案不起作用,可能是因为我没有清楚地解释自己。我不想加入不同的表。我总是使用同一张表,我只想避免同一字段出现多行。其背后的原因是我想稍后检查哪些本地人(local_id)在几年之间改变了活动。通过查询,如果我对 postgresql 说我想知道每个 id 的本地人在两个表(两年)中有不同的活动,那么我会得到具有相同 id 但不同活动的行之间的所有组合。跨度>
    • 并非如此。它在第 3 行中给了我一个 sintaxis 错误:FROM (SELECT id_local,我检查了括号是否有问题,但它一直给出同样的错误:(
    • 啊,我明白了。固定。
    • 成功了!!!!!!非常感谢 :) 我实际上仍然需要学习很多关于 sql 和 posgresql 的知识才能获得这些解决方案
    猜你喜欢
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多