这可能很简单,但无法弄清楚。
我的表摘要和函数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)。*表示法将select扩展为列。
答案 0 :(得分:2)
附加到问题的解决方案仍然存在语法错误。它应该是:
INSERT INTO Summary
SELECT (GetSummary(o.x, o.y)).*
FROM OtherTable o
WHERE <some condition>;
必须:
- 只有一个FROM
。
可选:
- 所需的SELECT
周围没有括号
- 表别名以简化语法。
Accessing Composite Types上的手册。
此外,您的函数似乎应该返回一个(或否)行。 如果是这种情况,您应该在SETOF
子句中删除 RETURNS
。那个:
CREATE FUNCTION getsummary( ... ) RETURNS summary AS ...