Update lub Insert (wiele wierszy i kolumn) z subquery w PostgreSQL

[[2]}próbuję zrobić coś takiego w 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)

Ale punkt 1 nie jest możliwy nawet z postgres 9.0, jak wspomniano w docs ( http://www.postgresql.org/docs/9.0/static/sql-update.html )

Również punkt 2 wydaje się nie działać. dostaję następujący błąd: subquery musi zwracać tylko jedną kolumnę.

Mam nadzieję, że ktoś mnie obejdzie. w przeciwnym razie zapytania zajmą mnóstwo czasu :(.

FYI: próbuję wybrać różne kolumny z kilku tabel i zapisać je w tymczasowej tabeli, aby inna aplikacja mogła łatwo pobrać przygotowane dane.

Author: Juan Mellado, 2010-09-17

3 answers

Do aktualizacji

Użycie:

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

Do wkładki

Użycie:

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

Nie potrzebujesz składni VALUES, Jeśli używasz SELECT do wypełnienia wartości wstawiania.

 141
Author: OMG Ponies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-17 16:14:36
UPDATE table1 SET (col1, col2) = (col2, col3) FROM othertable WHERE othertable.col1 = 123;
 12
Author: Walter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-15 21:09:17

ODPOWIEDŹ OMG kucyki działa idealnie, ale na wszelki wypadek, gdybyś potrzebował czegoś bardziej złożonego, oto przykład nieco bardziej zaawansowanego zapytania o aktualizację:

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;
 11
Author: David Namenyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-15 19:34:04