Обновление в PostgreSQL

#postgresql

#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,0),
(3,50,0),
(4,100,0),
(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

Комментарии:

1. Какой результат вы получаете?

2. Команда выполняется успешно, но ничего не обновляется. Проверьте связанный SQLFiddle

Ответ №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;
  

Ошибка SQLFiddle:http://sqlfiddle.com /#!12/96a90/43

Ответ №2:

Посмотрите документацию здесь:http://www.postgresql.org/docs/9.1/static/sql-update.html

 UPDATE TEST AS T1
SET Value2 = T2.Value1-T1.Value1
FROM TEST T2
WHERE T2.ID=(T1.ID 1);
  

http://sqlfiddle.com /#!12/96a90/40