平台Postgresql 9.2
我对Postgresql很新.我有这个场景,我已经能够在MSsql中解决,但同样的方法不适用于Postgres.
我有这张桌子
CREATE TABLE TEST( ID INT,Value1 INT,Value2 INT ); INSERT INTO TEST VALUES (1,10,0),(2,20,(3,50,(4,100,(5,500,0);
我需要在Value2列中运行总计,就像这样
UPDATE TEST SET Value2 = T2.Value1-T1.Value1 FROM TEST T1 INNER JOIN TEST T2 ON T2.ID=T1.ID+1; SELECT * FROM TEST;
虽然这在MSsql中完美运行,但它在Postgres中不起作用.该命令成功执行,但没有更新行.
但是,当我尝试这个时,我可以看到逻辑是正确的
SELECT T2.ID,T2.Value1-T1.Value1 FROM TEST T1 INNER JOIN TEST T2 ON T2.ID=T1.ID+1;
我在这做错了什么?
解决方法
第一:与sql Server不同,当您想要基于连接进行更新时,不会重复目标表.所以你的更新应该是这样的:
UPDATE TEST t1 SET Value2 = T2.Value1-T1.Value1 FROM TEST T2 where T2.ID = T1.ID+1;
但是这个更新,不会捕获最后一行(或第一行,取决于你如何加入它们)
但是使用Postgres,可以使用窗口函数来完成,这可能会更快一些(并且 – 至少在我看来 – 更容易阅读):
with summed as ( select id,sum(value1) over (order by id) as running_sum from test ) update test set value2 = running_sum from summed where summed.id = test.id;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。