微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL中的更新

平台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;

在这做错了什么?

SQLFIDDLE DEMO

解决方法

第一:与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;

sqlfiddlehttp://sqlfiddle.com/#!12/96a90/43

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐