Обновить столбец с суммой другого
Я использовал 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
);