Оновити або вставити (кілька рядків і стовпців) з підзапиту в PostgreSQL


106

Я намагаюся зробити щось подібне в 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, здається, не працює. Я отримую таку помилку: підзапит повинен повернути лише один стовпець.

Сподіваюсь, хтось має для мене обхід. інакше запити займуть цикл часу :(.

FYI: Я намагаюся вибрати різні стовпці з кількох таблиць і зберігати їх у тимчасовій таблиці, щоб інша програма легко отримала підготовлені дані.

Відповіді:


175

ЗА ОНОВЛЕННЯ

Використання:

UPDATE table1 
   SET col1 = othertable.col2,
       col2 = othertable.col3 
  FROM othertable 
 WHERE othertable.col1 = 123;

Для ВСТУП

Використання:

INSERT INTO table1 (col1, col2) 
SELECT col1, col2 
  FROM othertable

VALUESСинтаксис не потрібен, якщо ви використовуєте SELECT для заповнення значень INSERT.


1
Чи можливо комбінувати оновлення та вставити так, що якщо один не вдасться, інший буде використаний без помилки (незалежно для кожного ряду). Я думаю, що це було б більш повним вирішенням питання (наприклад: stackoverflow.com/a/6527838/781695 )
користувач

26

Відповідь 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;

1
Ти найкращий :) :)
Ашвіні

1
досконалий. це найкраще працює, коли вам потрібно вибрати підмножину на основі умови, що включає саму оновлену таблицю.
mythicalcoder

@David Namenyi чи можете ви пояснити цей запит?
Чінтан Патхак

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.