Aggiorna o inserisci (più righe e colonne) dalla sottoquery in PostgreSQL


106

Sto cercando di fare qualcosa del genere in 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)

Ma il punto 1 non è possibile nemmeno con postgres 9.0 come menzionato nei documenti ( http://www.postgresql.org/docs/9.0/static/sql-update.html )

Anche il punto 2 sembra non funzionare. ricevo il seguente errore: la subquery deve restituire solo una colonna.

Spero che qualcuno abbia una soluzione alternativa per me. altrimenti le query richiederanno un sacco di tempo :(.

FYI: sto cercando di selezionare colonne diverse da diverse tabelle e memorizzarle in una tabella temporanea, in modo che un'altra applicazione possa facilmente recuperare i dati preparati.

Risposte:


175

Per l'AGGIORNAMENTO

Uso:

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

Per l'INSERTO

Uso:

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

Non è necessaria la VALUESsintassi se si utilizza un SELECT per popolare i valori INSERT.


1
È possibile combinare Aggiorna e Inserisci in modo che se uno fallisce, l'altro verrà utilizzato senza generare un errore (indipendentemente per ogni riga). Penso che sarebbe una soluzione più completa alla domanda (ad esempio: stackoverflow.com/a/6527838/781695 )
utente

26

La risposta di OMG Ponies funziona perfettamente, ma nel caso avessi bisogno di qualcosa di più complesso, ecco un esempio di una query di aggiornamento leggermente più avanzata:

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
Sei il migliore :) :)
Ashwini

1
Perfetto. funziona meglio in cui è necessario scegliere un sottoinsieme in base a una condizione che coinvolge la tabella aggiornata stessa.
mythicalcoder

@David Namenyi puoi spiegare questa domanda?
Chintan Pathak

15
UPDATE table1 SET (col1, col2) = (col2, col3) FROM othertable WHERE othertable.col1 = 123;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.