【问题标题】:Update column with the sum of another one用另一列的总和更新列
【发布时间】:2019-04-22 23:08:47
【问题描述】:

我使用 PgAdmin4 开发了一个 PostGIS 数据库。 我试图用另一个名为“zones_cultures”的表中的另一列(名为“surface_cultures”)的总和来更新名为“parcelles”的表中的一列(名为“surface_net”)。表“zones_cultures”有一个带有“parcelles”的外键(“zones_cultures.id_parcelles”=“parcelles.id_egrid”)。

综上所述,“surface_net”列是“id_egrid”对“zones_cultures”组的总和。

所以我做了这个 SQL 查询来更新列“surface_net”:

UPDATE public.parcelles
    SET surface_net=
    (SELECT sum(zones_cultures.surface_cultures)
        FROM parcelles inner join zones_cultures on parcelles.id_egrid = zones_cultures.id_parcelles
        group by parcelles.id_egrid);

但它不起作用。结果如下:

ERROR:  more than one row returned by a subquery used as an expression
SQL state: 21000

有人可以帮助我处理我的 SQL 查询以更新“surface_net”列吗? 提前致谢

【问题讨论】:

标签: sql postgresql sql-update qsqlquery postgresql-11


【解决方案1】:

当你应用 group by 它返回多个值,结果它抛出错误,只需删除 group by 它就可以了

UPDATE public.parcelles
    SET surface_net=
    (SELECT sum(zones_cultures.surface_cultures)
        FROM parcelles inner join zones_cultures on parcelles.id_egrid = zones_cultures.id_parcelles
        );

或者如果你想更新每个 id 然后使用下面不需要 group by

UPDATE public.parcelles p
    SET p.surface_net=
    (SELECT sum(zones_cultures.surface_cultures)
        FROM parcelles inner join zones_cultures on parcelles.id_egrid = zones_cultures.id_parcelles
        where parcelles.id_egrid = p.id_egrid
       );

【讨论】:

    【解决方案2】:

    您需要在子查询中使用 WHERE 子句,使其为您正在更新的表的 1 行返回 1 个相关结果。我相信这应该可行:

    UPDATE public.parcelles p
        SET surface_net=
        (SELECT sum(zones_cultures.surface_cultures)
            FROM parcelles inner join zones_cultures on parcelles.id_egrid = zones_cultures.id_parcelles
            where parcelles.id_egrid = p.id_egrid
            group by parcelles.id_egrid);
    

    【讨论】:

    • 我很高兴它做到了。如果这对您有用,请不要忘记投票并接受。
    • 最后一个问题:您知道我如何使用此代码创建“自动更新”吗?我希望每次在“zones_cultures”中添加新值时,“parcelles”表都会根据您提供的更新自动更新。
    • @SophieCompagnon 通常,您可以通过两种方式做到这一点:让parcelles 成为view 而不是表格,或者使用trigger。通常应避免使用触发器,因为它们是维护的噩梦。所以处理这个问题的最好方法是创建一个视图。如果您需要更多帮助,最好为此创建一个新问题。
    【解决方案3】:

    你可以试试下面

    UPDATE public.parcelles p
        SET surface_net=sum(zones_cultures.surface_cultures)
     inner join zones_cultures where p.id_egrid = zones_cultures.id_parcelles
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2014-11-25
      • 2022-12-03
      • 2017-08-20
      相关资源
      最近更新 更多