3

这可能很简单,但无法弄清楚。

我有表摘要和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).* 符号将选择扩展到列。

4

1 回答 1

3

附加到问题的解决方案仍然存在语法错误。它应该是:

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

必须:
- 只有一个FROM

可选:
- 需要的周围没有括号SELECT
- 表别名以简化语法。

访问复合类型的手册。


此外,您的函数似乎应该返回一行(或不返回)。如果是这种情况,您应该删除子句SETOF中的。RETURNS做到这一点:

CREATE FUNCTION getsummary( ... ) 将
   摘要返回为...
于 2012-05-28T20:44:38.020 回答