2010-02-16 25 views
11

Actualmente estoy trabajando en un servlet de generación de informes que aglomera información de varias tablas y genera un informe. Además de devolver las filas resultantes, también las estoy almacenando en una tabla de informes para que no necesiten volver a generarse más tarde, y persistirán si se eliminan las tablas de las que se extrajeron. Para hacer esto último tengo una declaración de la forma (NB: x se genera externamente y, de hecho una constante en esta declaración):Devolución de filas insertadas en 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 

Esto funciona bien, pero necesito una segunda consulta para volver realidad la resultante filas atrás, por ejemplo

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

Esto funciona bien y ya que sólo implica la tabla única, no debe ser costoso, pero parece que debería ser capaz de volver directamente los resultados de la inserción evitar la segunda consulta. ¿Hay alguna sintaxis para hacer esto que no he podido encontrar? (Debo señalar, soy bastante nuevo en el trabajo DB, por lo que si la respuesta correcta es que basta con ejecutar la segunda consulta, ya que es sólo ligeramente más lento, que así sea)

Respuesta

20

En PostgreSQL con la versión> = 8.2, puede usar esta construcción:

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

nos estamos quedando 8.4 por lo que es perfecto, gracias. – Dusty

+0

+1 para una respuesta sólida y (también) mencionando los requisitos de versión (aunque la mayoría de las personas deberían tener al menos 8.3 ahora) – ChristopheD

3

o sin selecto:

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

documentation

+1

Creo que el Operador pidió devolver toda la fila, que sería 'DEVUELTA *;' – BishopZ

Cuestiones relacionadas