Обновление столбца PostgreSQL 8.4 с агрегатной функцией

У меня есть две таблицы "Hello" и "World":

  • "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 для каждого идентификатора, затем помещаю ее во временную таблицу, а затем ОБНОВЛЯЮ на основе этого значения, но я не могу собрать ее вместе, поэтому я думаю, что это может не лучший путь к решению?


person Eric Mark Hopkins    schedule 03.04.2011    source источник
comment
Я не думаю, что вам нужны агрегаты. Откуда вы знаете, что все идентификаторы не были равны нулю перед запросом? Ваш запрос выглядит так, как будто он должен работать для меня. Может столбец перепутался или что-то в этом роде.   -  person nate c    schedule 03.04.2011


Ответы (1)


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

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

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 не была изменена.

person Aleksi Yrttiaho    schedule 03.04.2011