PostgreSQL 8.4使用聚合函数进行列更新

时间:2011-04-03 02:31:42

标签: sql postgresql count sql-update

我有两张桌子,“你好”和“世界”:

  • “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,而不是为每次出现id = id2添加1 在寻找解决方案后,似乎我需要使用聚合函数但是 从以前的帖子我知道UPDATE中不允许这样做。

我对一个解决方案有一个模糊的想法,我得到每个id的id = id2的总和然后把它放在一个临时表然后根据该值UPDATE但我似乎无法把它放在一起所以我是认为这可能不是解决方案的最佳途径?

1 个答案:

答案 0 :(得分:0)

这就是我的所作所为:

<强>初始化

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 + 1z1.n的值仅在开头确定,并且不会更新,因为更多行匹配。这样,结果等同于执行SELECT select *, t1.n + 1 from t1,t2 where t1.id = t2.id;

所获得的结果

请注意,如果至少有一行UPDATE为真,则每t1.id = t2.id会将n中的所有值增加1。

测试案例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后的最终结果都相同。

相关问题