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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |