powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сложный UPDATE
8 сообщений из 8, страница 1 из 1
Сложный UPDATE
    #33713028
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется две таблицы
\d oplats
Таблица "public.oplats"
Колонка | Тип | Модификаторы
------------+------------------+-----------------------------------------------------
id_opl | integer | not null default nextval('oplats_id_opl_seq'::text)
sum_opl | double precision |
date_opl | date |
where_prin | text |
id | integer |
Индексы:
"oplats_pkey" ключевое поле, btree (id_opl)

clients=# \d dolgs
Таблица "public.dolgs"
Колонка | Тип | Модификаторы
-----------+------------------+-----------------------------------------------------
id_dolg | integer | not null default nextval('dolgs_id_dolg_seq'::text)
dolg | double precision |
date_dolg | date |
id | integer |
Индексы:
"dolgs_pkey" ключевое поле, btree (id_dolg)

Требуется в конце месяца обновлять таблицу dolgs,суммируя все оплаты для каждого id и обновлять соответствующие строки таблицы dolgs (с совпадающими полями id)?
Можно ли обойтись простым SQL запросом UPDATE ...?
...
Рейтинг: 0 / 0
Сложный UPDATE
    #33713449
sergey888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожно ли обойтись простым SQL запросом UPDATE ...?

А зачем?
напиши процедурку, которая в цикле будет делать update.
...
Рейтинг: 0 / 0
Сложный UPDATE
    #33713909
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется две таблицы
\d oplats
Таблица "public.oplats"
Колонка | Тип | Модификаторы
------------+------------------+-----------------------------------------------------
id_opl | integer | not null default nextval('oplats_id_opl_seq'::text)
sum_opl | double precision |
date_opl | date |
where_prin | text |
id | integer |
Индексы:
"oplats_pkey" ключевое поле, btree (id_opl)

clients=# \d dolgs
Таблица "public.dolgs"
Колонка | Тип | Модификаторы
-----------+------------------+-----------------------------------------------------
id_dolg | integer | not null default nextval('dolgs_id_dolg_seq'::text)
dolg | double precision |
date_dolg | date |
id | integer |
Индексы:
"dolgs_pkey" ключевое поле, btree (id_dolg)

Требуется в конце месяца обновлять таблицу dolgs,суммируя все оплаты для каждого id и обновлять соответствующие строки таблицы dolgs (с совпадающими полями id)?
Можно ли обойтись простым SQL запросом UPDATE ...?
...
Рейтинг: 0 / 0
Сложный UPDATE
    #33713959
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
postt
Вопрос не относится к проектированию БД. Переносится в Ваш любимый PostgreSQL
...
Рейтинг: 0 / 0
Сложный UPDATE
    #33713994
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалите тогда одну из одинаковых тем.Я уже сам перенес сюда.:)
...
Рейтинг: 0 / 0
Сложный UPDATE
    #33714254
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table t1 ( id integer, payment integer );
create table t2 ( id integer, balance integer );
insert into t1 values (  1 ,  100  );
insert into t1 values (  1 , - 50  );
insert into t1 values (  2 ,  100  );
insert into t1 values (  2 ,  100  );
insert into t1 values (  3 ,  300  );
insert into t2 select distinct id from t1;
select * from t2;
update t2 set balance=( select sum(payment) from t1 where t1.id=t2.id );
select * from t2;
drop table t1;
drop table t2;
...
Рейтинг: 0 / 0
Сложный UPDATE
    #33716891
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще есть замечательная вещь типа
update .. from .. where
подробности в доках.

гораздо мощьнее чем способ:
update t2 set balance=( select sum(payment) from t1 where t1.id=t2.id );
...
Рейтинг: 0 / 0
Сложный UPDATE
    #33717658
victor_kr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде бы можно. Команда будет выглядеть приметно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
update dolgs
  set dolgs = coalesce(dolgs,  0 ) + coalesce(sum_opl,  0 )
  from (
         select id, sum(sum_opl) as sum_opl
           from oplats
           where date_opl between :p_date_opl_begin and :p_date_opl_end
           group by id
         ) oplats
  where dolgs.id = oplats.id
    and date_dolg = :p_date_dolg
.

При этом, если в таблице oplats есть id, которых нет в dolgs, то они не будут добавлены. Это нужно сделать отдельной командой insert. Ну и индексов бы еще не помешало добавить, например по датам и по id. :-)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сложный UPDATE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]