Sql 返回类型的函数运行多次

Sql 返回类型的函数运行多次,sql,postgresql,Sql,Postgresql,这是我的第一个问题,如果我做错了,很抱歉 我在PostgreSQL中有一个返回类型的函数,我想显示该类型的所有字段。 起初,我正在执行以下SQL: SELECT (FC_FUNCTION(FIELD_A, FIELD_B, FIELD_C)).* FROM TABLE 但我注意到它跑得太慢了。检查后,它看起来像是在为该类型的每个字段再次运行该函数。将SQL更改为以下值不仅返回相同的结果,而且速度更快: SELECT (X).* FROM (SELECT FC_FUNCTION(FIELD_

这是我的第一个问题,如果我做错了,很抱歉

我在PostgreSQL中有一个返回类型的函数,我想显示该类型的所有字段。 起初,我正在执行以下SQL:

SELECT (FC_FUNCTION(FIELD_A, FIELD_B, FIELD_C)).*
FROM   TABLE
但我注意到它跑得太慢了。检查后,它看起来像是在为该类型的每个字段再次运行该函数。将SQL更改为以下值不仅返回相同的结果,而且速度更快:

SELECT (X).*
FROM (SELECT FC_FUNCTION(FIELD_A, FIELD_B, FIELD_C) AS X FROM TABLE) A
这是正确的做法吗?对我来说,这更像是一种变通而非解决方案。谢谢

这是:

[…]这两个查询具有相同的结果:

SELECT (myfunc(x)).* FROM some_table;
SELECT (myfunc(x)).a, (myfunc(x)).b, (myfunc(x)).c FROM some_table;
小费

PostgreSQL通过将第一种形式转换为第二种形式来处理列扩展。因此,在本例中,
myfunc()
将使用任一语法在每行调用三次。如果这是一个昂贵的函数,您可能希望避免这种情况,您可以使用以下查询:

SELECT m.* FROM some_table, LATERAL myfunc(x) AS m;
将函数放置在
横向FROM
项中可以防止每行调用该函数不止一次
m.*
仍然扩展为
m.a、m.b、m.c
,但现在这些变量只是对来自
项的
输出的引用。(此处,
LATERAL
关键字是可选的,但我们显示它是为了澄清函数是从
一些表中获取
x


你能分享函数定义吗?还有预期的输出?我搜索了一下,没有找到这个文档,非常感谢!