#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;
Что я здесь делаю не так?
Комментарии:
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);