2016-11-08 28 views
1

我需要一些幫助。來自SELECT WHERE的SQL多個更新記錄

我想完全數量的材料在任何帳單中具有相同的ID。

這樣

bill no. 001 
jellopy x1ea 
jellopy x1ea 
jellopy x1ea 
zargon x1ea 

結果應該是

bill no. 001 
jellopy x3ea 
zargon x1ea 

所以,我想要做這樣的事情

1.select +總和2.更新3.刪除重複

這裏是我的老(dbill)表

dbill

id mat qty 
01 A1 1 
01 A1 1 
01 A1 1 
01 A2 1 

id mat qty 
[01 A1 1] < same mat&id = SUM it 
[01 A1 1] < same mat&id = SUM it 
[01 A1 1] < same mat&id = SUM it 
01 A2 1 

,這是SQLFiddle測試http://sqlfiddle.com/#!15/b30a3c用相同的材​​料

1 SUM量

SELECT mat,id,sum(qty) result 
FROM dbill 
GROUP BY id,mat 

[2]得到導致這樣

id mat qty 
01 A1 3 
01 A2 1 

[3]所以...我會更新這樣

UPDATE dbill 
SET qty = result 
FROM dbill t 
INNER JOIN 
(SELECT mat,id,sum(qty) result 
FROM dbill 
GROUP BY id,mat) s 
ON s.id = t.id 
AND s.mat = t.mat 

的問題是,當我[3] UPDATE這裏是結果

id mat qty 
01 A1 3 
01 A1 3 
01 A1 3 
01 A2 3 

,因爲正確的結果應該be

id mat qty 
01 A1 3 
01 A1 3 
01 A1 3 
01 A2 1  < 

非常感謝您的理解和回答...

+2

[從手動報價](https://www.postgresql.org/docs/current/static/sql-update.html):「*注意,目標表必須** **不出現在from_list *「 –

回答

1

對我來說,您的查詢似乎是確定只是UPDATE t

UPDATE t <---- 
SET qty = result 
FROM dbill t 
INNER JOIN 
(SELECT mat,id,sum(qty) result 
FROM dbill 
GROUP BY id,mat) s 
ON s.id = t.id 
AND s.mat = t.mat 
+0

恕我直言,這是Microsoft語法。 – joop

+0

同樣的結果對我來說,我想,無論如何,謝謝:) – Thawatchai

0

更換UPDATE dbill這也許是不太優雅,但應該工作

UPDATE dbill t 
    SET t.qty = (select sum(qty) from dbill t2 where t2.id=t.id and t2.mat=t.mat) 
0

問題解決了!

在這裏,這是我的解決方案。 (我可以從我的應用程序獲得t3.id,所以我只是將它連接起來)。

UPDATE dbill t3 
SET qty = t2.result 
FROM (
SELECT matno,hbill_ids,sum(qty) result 
FROM dbill t1 
GROUP BY hbill_ids,matno) t2 
WHERE (t3.hbill_ids = t2.hbill_ids 
AND t3.matno = t2.matno) 
AND (t3.id = 372 
OR t3.id = 373 
OR t3.id = 374 
OR t3.id = 375); 
DELETE FROM dbill t3 
WHERE id IN (SELECT id 
FROM dbill y1 
WHERE EXISTS ( 
SELECT * 
FROM dbill y2 
WHERE y1.matno = y2.matno 
AND y1.qty = y2.qty 
AND y1.hbill_ids = y2.hbill_ids 
AND y1.id < y2.id 
AND (t3.id = 372 
OR t3.id = 373 
OR t3.id = 374 
OR t3.id = 375) 
));