2012-05-28 67 views
2

集返回函數這可能是簡單的東西,但不能弄明白。插入到表從參數

我已經表彙總和功能GetSummary返回行作爲集總結。我可以查詢它像這樣

SELECT GetSummary(arg1, arg2) 
GetSummary 
----------- 
(val1, val2, val3) 

而且像這樣的返回實際列:

SELECT * FROM GetSummary(arg1, arg2) 
col1 | col2 | col3 
------------------------ 
val1 | val2 | val3 

插入到總結工作正常:

INSERT INTO Summary (SELECT * FROM GetSummary(arg1, arg2)); 
INSERT 0 1 

但我無法弄清楚如何根據其他表中的列一次插入多行。我願做這樣的事情:

INSERT INTO Summary (SELECT FROM GetSummary(OtherTable.x, OtherTable.y) 
FROM OtherTable WHERE <some query>); 

失敗,因爲SELECT FROM GetSummary ..不返回彙總錶行。查詢SELECT * FROM GetSummary ..會這樣做,但後來我不知道如何編寫查詢。

編輯

正巧發佈後栽倒解決方案几分鐘。正確的語法是

INSERT INTO Summary (SELECT (GetSummary(OtherTable.x, OtherTable.y)).* 
FROM OtherTable WHERE <some query>); 

的(X)。*符號擴展選擇列。

+0

從其他表中的其他列?你的意思是你只想從你的函數表中選定的行?如果是這樣,你需要內部加入由函數和其他列表返回的表。 –

回答

2

附加到問題解決方案仍然有語法錯誤。它應該是:

INSERT INTO Summary 
SELECT (GetSummary(o.x, o.y)).* 
FROM OtherTable o 
WHERE <some condition>; 

必須:
- 只有一個FROM

可選:
- 圍繞SELECT沒有括號需要。
- 簡化語法的表別名。

Accessing Composite Types的手冊。


而且,似乎你的函數應該返回一個(或沒有)一行。 如果是這樣的話,你應該在RETURNS子句中刪除SETOF。作出這樣的:

 
CREATE FUNCTION getsummary(...) 
    RETURNS summary AS ... 
+0

感謝您對此進行清理。該函數確實返回一行。 –