Обновить или вставить (несколько строк и столбцов) из подзапроса в PostgreSQL
Я пытаюсь сделать что-то подобное в postgres:
-
UPDATE table1 SET (col1, col2) = (SELECT col2, col3 FROM othertable WHERE othertable.col1 = 123);
-
INSERT INTO table1 (col1, col2) VALUES (SELECT col1, col2 FROM othertable)
Но точка 1 невозможна даже с postgres 9.0, как указано в документах (http://www.postgresql.org/docs/9.0/static/sql-update.html)
Также точка 2 кажется неработоспособной. Я получаю следующую ошибку: subquery должен возвращать только один столбец.
Надеюсь, у кого-то есть обходной путь для меня. в противном случае запросы займут время: (.
FYI: Я пытаюсь выбрать разные столбцы из нескольких таблиц и хранить их во временной таблице, так что другое приложение может легко получить подготовленные данные.
Ответы
Ответ 1
Для UPDATE
Использование:
UPDATE table1
SET col1 = othertable.col2,
col2 = othertable.col3
FROM othertable
WHERE othertable.col1 = 123;
Для INSERT
Использование:
INSERT INTO table1 (col1, col2)
SELECT col1, col2
FROM othertable
Вам не нужен синтаксис VALUES
, если вы используете SELECT для заполнения значений INSERT.
Ответ 2
UPDATE table1 SET (col1, col2) = (col2, col3) FROM othertable WHERE othertable.col1 = 123;
Ответ 3
Ответы OMG Ponies работают отлично, но на всякий случай вам нужно что-то более сложное, вот пример немного более продвинутого запроса на обновление:
UPDATE table1
SET col1 = subquery.col2,
col2 = subquery.col3
FROM (
SELECT t2.foo as col1, t3.bar as col2, t3.foobar as col3
FROM table2 t2 INNER JOIN table3 t3 ON t2.id = t3.t2_id
WHERE t2.created_at > '2016-01-01'
) AS subquery
WHERE table1.id = subquery.col1;