返回多列PLPGSQL函数被调用多次(plpgsql function that returns m

2019-10-17 17:58发布

我运行的PostgreSQL 9.2.1,并有一个返回3列的PLPGSQL功能。 这就是所谓的像这样(简化):

SELECT (my_function(b.input)).*, a.other, b.columns
FROM table_a a
JOIN table_b b ON a.id = b.id
WHERE ...

功能打印出警告消息,并且我很惊讶地发现它印刷3次。 它看起来像函数被调用3次 - 大概是一次为每个列。 这不能很好的表现! 我怎样才能确保它被称为只有一次? 它已经标记为稳定。

如果我把它作为

SELECT * FROM my_function(input)

然后警告只打印一次,但我不知道我怎么能整合到与连接和返回等栏目更大的查询。 也就是说,我不知道如何把功能分为从列表,当我需要在其他表发件人列表功能,从那些需要它的输入。

编辑

查询(更接近原始的):

SELECT (my_aggregate_function(sub1.border, sub1.lower_limit, sub1.upper_limit, operation)).*
FROM
(
    SELECT (my_function(ca.timeslice_id)).*, agc.operation
    FROM geometry_component agc
    JOIN volume av ON agc.volume_id = av.id
    JOIN volume_dependency avd ON av.contributor_id = avd.id
    JOIN my_rowset_function('2013-02-22') ca ON avd.id = ca.feature_id
    WHERE agc.timeslice_id = 12345
    ORDER BY agc.sequence
) sub1

my_aggregate_functionmy_function每个返回3列(边框,LOWER_LIMIT,UPPER_LIMIT),但my_aggregate_function是聚合和my_function是一个普通的功能。

Answer 1:

这应该做的工作:

SELECT (y).*
FROM  (
   SELECT my_aggregate_function(border, lower_limit, upper_limit, operation) AS y
   FROM (
      SELECT (x).*, operation
      FROM  (
         SELECT my_function(ca.timeslice_id) AS x, agc.operation
         FROM   geometry_component agc
         JOIN   volume             av  ON av.id = agc.volume_id
         JOIN   volume_dependency  avd ON avd.id = av.contributor_id
         JOIN   my_rowset_function('2013-02-22') ca ON ca.feature_id = avd.id
         WHERE  agc.timeslice_id = 12345
         ORDER  BY agc.sequence
         ) sub1
      )sub2
   )sub3


Answer 2:

不幸的是,这是执行正常的怪癖。 这将有可能避免这一问题时,支持LATERAL查询与9.3去英寸

现在我不知道任何很好的办法解决的。



文章来源: plpgsql function that returns multiple columns gets called multiple times