2010-02-16 16 views
11

Attualmente sto lavorando a un servlet di generazione di report che agglomera le informazioni da diverse tabelle e genera un report. Oltre a restituire le righe risultanti, le sto anche memorizzando in una tabella di report in modo che non debbano essere rigenerate in un secondo momento e continueranno a persistere se le tabelle da cui sono tratte vengono cancellate. Per fare quest'ultima ho un enunciato della forma (NB: x è generato esternamente ed effettivamente una costante in questa affermazione):Ritorno di righe inserite in PostgreSQL

INSERT INTO reports 
    (report_id, col_a, col_b, col_c) 
SELECT x as report_id, foo.a, bar.b, bar.c 
FROM foo, bar 

Questo funziona bene, ma poi ho bisogno di una seconda query per restituire effettivamente risultante righe indietro, ad es

SELECT col_a, col_b, col_c 
FROM reports 
WHERE report_id = x 

Questo funziona bene e poiché coinvolge solo la singola tabella, non dovrebbe essere costoso, ma sembra che dovrebbe essere in grado di restituire direttamente i risultati dell'inserimento evitando la seconda query. C'è qualche sintassi per fare ciò che non sono stato in grado di trovare? (Dovrei notare, sono abbastanza nuovo al lavoro DB, quindi se la risposta giusta è solo eseguire la seconda query, poiché è solo leggermente più lento, così sia)

risposta

20

In PostgreSQL con versione> = 8.2, tu possibile utilizzare questo costrutto:

INSERT INTO reports (report_id, col_a, col_b, col_c) 
SELECT x as report_id, foo.a, bar.b, bar.c 
FROM foo, bar 
RETURNING col_a, col_b, col_c 
+0

stiamo correndo 8.4 in modo che sia perfetto, grazie. – Dusty

+0

+1 per una risposta valida e (anche) menzionando i requisiti della versione (anche se la maggior parte delle persone dovrebbe essere almeno su 8.3 ora) – ChristopheD

3

O senza selezionare:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets') 
    RETURNING did; 

documentation

+1

Credo che l'Op abbia chiesto di restituire l'intera riga, che sarebbe 'RETURNING *;' – BishopZ

Problemi correlati