2011-04-03 80 views
0

我有兩個表, 「你好」 和 「世界」:的PostgreSQL 8.4列的更新與聚合函數

  • 「你好」 有兩列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 四處尋找它似乎是一個解決方案後,我需要使用聚合函數,但 從以前的帖子我知道這是不允許的內更新。

我有一個解決方案的模糊的想法,我得到的id = id2每個id的總和然後把它放在一個臨時表,然後更新基於該值,但我似乎無法把它放在一起,所以我'我認爲這可能不是解決問題的最佳途徑?

+0

我不認爲你需要聚合。你怎麼知道在查詢之前所有的id都不是零?你的查詢看起來應該對我有用。也許一列是混在一起或類似的東西。 – 2011-04-03 03:07:26

回答

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值被確定只有在開始時它纔會更新,因爲更多行匹配。這樣的結果就相當於一個你通過執行SELECTselect *, t1.n + 1 from t1,t2 where t1.id = t2.id;

請注意,每UPDATE將由一個,如果有至少一個行鍼對t1.id = t2.id是真的遞增n的所有值。

測試案例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尚未修改後的最終結果是一樣的。

+0

嚇壞了,豎起大拇指! – 2011-04-03 04:17:14