用另一项的总和更新列

时间:2018-11-20 13:31:50

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

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

总而言之,“ surface_net”列是“ idsegrid”中“ 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”列吗? 预先感谢

3 个答案:

答案 0 :(得分:0)

当您应用分组依据时由于抛出错误而返回多个值,只需删除分组即可起作用

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,则在“不需要分组依据”下使用

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
       );

答案 1 :(得分:0)

您需要在子查询中使用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);

答案 2 :(得分:0)

您可以在下面尝试

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