2010-02-16 15 views
11

Obecnie pracuję nad serwletem generowania raportów, który scala informacje z kilku tabel i generuje raport. Oprócz zwracania wynikowych wierszy przechowuję je również w tabeli raportów, więc nie będą musiały być później regenerowane i będą trwałe, jeśli tabele, z których pochodzą, zostaną wyczyszczone. Aby wykonać ten ostatni mam oświadczenie o formie (NB: x jest zewnętrznie generowane i rzeczywiście stała w tym stwierdzeniem):Zwracanie wstawionych wierszy w 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 

Działa to dobrze, ale potem muszę drugą kwerendę, aby rzeczywiście powrócić otrzymaną wiersze z powrotem, np

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

Działa to dobrze, a ponieważ obejmuje tylko pojedynczą tabelę, nie powinny być drogie, ale wydaje się, że powinienem być w stanie bezpośrednio powrócić wyniki wstawienie unikając drugiego zapytania. Czy jest jakaś składnia do robienia tego, czego nie udało mi się znaleźć? (Powinienem zauważyć, że jestem całkiem nowym pracownikiem DB, więc jeśli właściwą odpowiedzią jest po prostu wykonanie drugiego zapytania, ponieważ jest to tylko nieco wolniej, niech tak będzie),

Odpowiedz

20

W PostgreSQL z wersją> = 8,2 może użyć tego konstruktu:

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

Biegniemy 8.4, dzięki czemu jest idealny, dzięki. – Dusty

+0

+1 za solidną odpowiedź i (także) wymienienie wymagań dotyczących wersji (chociaż większość ludzi powinna być na razie przynajmniej w wersji 8.3). – ChristopheD

3

Albo bez wybierz:

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

documentation

+1

Wierzę, że Op poprosił o zwrócenie całego wiersza, co oznaczałoby "POWRÓT *"; – BishopZ

Powiązane problemy