2010-02-16 42 views
11

我目前正在研究一個報告生成servlet,它聚集來自多個表的信息並生成報告。除了返回結果行之外,我還將它們存儲到報表中,以便它們不需要稍後重新生成,並且如果它們從中抽取的表被擦除,它們將保持不變。對於後者我有形式的語句(注意:X是外部產生的,實際上在此聲明常數):在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 

這工作得很好,但後來我需要第二次查詢實際返回結果倒行,例如

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

這工作正常,因爲它僅涉及單個表,不應該是昂貴的,但好像我應該可以直接返回插入避免了第二次查詢的結果。有沒有一些語法來做到這一點,我一直沒有找到? (我應該注意到,我在數據庫工作方面相當新,所以如果正確的答案是隻運行第二個查詢,因爲它只是稍微慢一些,所以它是)

回答

20

在版本大於等於8.2的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 
RETURNING col_a, col_b, col_c 
+0

我們正在運行8.4所以這是完美的,謝謝。 – Dusty

+0

+1對於一個堅實的答案和(也)提及版本要求(雖然大多數人現在應該至少8.3) – ChristopheD

3

或者不選擇:

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

documentation

+1

我相信歐普要求返回整行,這將是'RETURNING *;' – BishopZ