J'ai utilisé PgAdmin4 pour développer une base de données PostGIS. J'ai essayé de mettre à jour une colonne (appelée "surface_net") dans une table appelée "parcelles" avec la somme d'une autre colonne (appelée "surface_cultures") dans une autre table appelée "zones_cultures". La table "zones_cultures" a une clé étrangère avec "parcelles" ("zones_cultures.id_parcelles" = "parcelles.id_egrid").

Pour résumer, la colonne "surface_net" est la somme du groupe "zones_cultures" par le "id_egrid".

J'ai donc fait cette requête SQL pour mettre à jour la colonne "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);

Mais ça ne marche pas. Voici le résultat:

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

Quelqu'un pourrait-il m'aider avec ma requête SQL pour pouvoir mettre à jour la colonne "surface_net"? Merci d'avance

1
Sophie Compagnon 20 nov. 2018 à 16:31

3 réponses

Meilleure réponse

Vous avez besoin d'une clause WHERE dans la sous-requête qui renvoie 1 résultat pertinent pour 1 ligne de la table que vous mettez à jour. Je pense que cela devrait fonctionner:

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);
0
wvdz 20 nov. 2018 à 13:38

Lorsque vous avez appliqué le groupe par, il a renvoyé plusieurs valeurs, ce qui a renvoyé une erreur, il suffit de supprimer le groupe par cela fonctionnera

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

Ou si vous souhaitez mettre à jour par identifiant, utilisez ci-dessous aucun groupe nécessaire par

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
       );
0
Zaynul Abadin Tuhin 20 nov. 2018 à 13:38

Vous pouvez essayer ci-dessous

UPDATE public.parcelles p
    SET surface_net=sum(zones_cultures.surface_cultures)
 inner join zones_cultures where p.id_egrid = zones_cultures.id_parcelles
0
Fahmi 20 nov. 2018 à 13:39