Обновить столбец с суммой другого - PullRequest
0 голосов
/ 20 ноября 2018

Я использовал PgAdmin4 для разработки базы данных PostGIS.Я попытался обновить столбец (называемый "surface_net") в таблице с именем "parcelles", добавив сумму в другой столбец (называемый "surface_cultures") в другой таблице, которая называется "zone_cultures".Таблица "zone_cultures" имеет внешний ключ с "parcelles" ("zone_cultures.id_parcelles" = "parcelles.id_egrid").

Подводя итог, столбец "surface_net" представляет собой сумму группы "zone_cultures" по идентификатору "id_egrid".

Поэтому я выполнил этот 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 голосов
/ 20 ноября 2018

В подзапросе требуется условие 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);
0 голосов
/ 20 ноября 2018

Вы можете попробовать ниже

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 голосов
/ 20 ноября 2018

когда вы применили группу к нему, вернули несколько значений, в результате чего возникла ошибка, просто удалить группу по ней будет работать

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

Или, если вы хотите обновить по идентификатору, используйте ниже не нужно группировать по

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