加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL中的更新

发布时间:2020-12-13 16:00:05 所属栏目:百科 来源:网络整理
导读:平台PostgreSQL 9.2 我对PostgreSQL很新.我有这个场景,我已经能够在MSSQL中解决,但同样的方法不适用于Postgres. 我有这张桌子 CREATE TABLE TEST(ID INT,Value1 INT,Value2 INT);INSERT INTO TESTVALUES(1,10,0),(2,20,(3,50,(4,100,(5,500,0); 我需要在Valu
平台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;

SQLFiddle:http://sqlfiddle.com/#!12/96a90/43

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读