2016-11-08 35 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) 
));