PostgreSQL 8.4 Обновление столбцов с агрегатной функцией - PullRequest
0 голосов
/ 03 апреля 2011

У меня есть две таблицы: «Привет» и «Мир»:

  • «Hello» имеет два столбца id (int) и id1 (int, значение по умолчанию 0)

  • «Мир» имеет столбец id2 (int)

Всякий раз, когда id = id2, я хотел бы +1 к id1.

Я пробовал это использовать UPDATE, вот так

UPDATE "Hello" z1 set id1=z1.id1 + 1 FROM "World" z2 WHERE
z1.id = z2.id2

Но это изменило каждый столбец на 1 вместо добавления 1 для каждого вхождения id = id2 После поиска решения кажется, что мне нужно использовать агрегатную функцию, но из предыдущих постов я знаю, что не допускается в UPDATE.

У меня есть смутное представление об одном решении, где я получаю сумму для id = id2 для идентификатора, затем помещаю ее во временную таблицу и затем ОБНОВЛЯЮСЬ на основе этого значения, но я не могу собрать ее вместе, поэтому думая, что это не лучший путь к решению?

1 Ответ

0 голосов
/ 03 апреля 2011

Вот что я сделал:

Инициализация

create table t1 (id int, n int default 0);
create table t2 (id int);

insert into t1 values (1), (2), (3);
insert into t2 values (1), (2), (2), (3), (3), (3);

Таблицы в начале

t1:

id ; n
1  ; 0
2  ; 0 
3  ; 0

t2

id
1
2
2
3
3
3

Контрольный пример 1:

update t1 z1 set n = z1.n + 1 from t2 z2 where z1.id = z2.id;

Результат - то, что вы описали, т.е. t1

id ; n
1  ; 1
2  ; 1 
3  ; 1

Я подозреваю, что причина этого результата в том, что в z1.n + 1 значение z1.n определяется только в начале, и оно не обновляется при совпадении большего количества строк.Таким образом, результат будет эквивалентен результату, который вы получите, выполнив SELECT select *, t1.n + 1 from t1,t2 where t1.id = t2.id;

Обратите внимание, что каждый UPDATE будет увеличивать все значения в n на единицу, если есть хотя бы одна строка, для которойt1.id = t2.id верно.

Контрольный пример 2:

update t1 set n = (select count(*) from t2 where t2.id = t1.id)

Результат был тем, что вы ожидали, т.е. t1

id ; n
1  ; 1
2  ; 2 
3  ; 3

Обратите внимание, что конечный результат остается тем же послекаждый UPDATE, если таблица t2 не была изменена.

...