Обновить столбец с суммой другого

Я использовал 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 ответа

Решение

Тебе необходимо 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);

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

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

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

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
       );
Другие вопросы по тегам