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.
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.
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;
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;
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