在设置返回函数结果上进行JOIN

在设置返回函数结果上进行JOIN,第1张

在设置返回函数结果上进行JOIN

在Postgres 9.1中

SELECt name, (f).*  -- note the parentheses!FROM  (SELECt name, calculate_payments(id) AS f FROM person) sub;

假设 您的函数具有定义明确的带有列名的返回类型

(id, action, amount)
-问题中缺少信息。
还要假设您的函数始终返回与
id
进给相同的函数(在这种情况下这是多余的,并且可能已经过优化)。

同样 ,但更为冗长:

SELECt sub.id, sub.name, (sub.f).action, (sub.f).amount  -- parentheses!FROM  (   SELECt p.id, p.name, calculate_payments(p.id) AS f(id, action, amount)   FROM   person p) sub;

SELECt
列表中的集合返回函数导致多行。但这是一个非标准且有些古怪的功能。
LATERAL
最好使用pg 9.3+中的新功能。

可以 在同一步骤中分解行类型:

SELECT *, (calculate_payments(p.id)).*  -- parentheses!FROM   person p

但是由于Postgres查询计划器的弱点,导致每列对该函数进行一次评估

  • 如何在SQL查询中使用(func())。*语法避免使用多个函数评估?

或您的情况:

SELECt p.id, p.name     , (calculate_payments(p.id)).action     , (calculate_payments(p.id)).amountFROM   person p

同样的问题:多重评估。

确切地说,pg 9.3+中的解决方案的等效项是:

SELECt p.id, p.name, f.action, f.amountFROM   person pLEFT   JOIN LATERAL calculate_payments(p.id) f ON TRUE;

在函数返回0行的结果中保留行。

如果您对此不关心,则可以在9.3+版中进行简化:

SELECt p.id, p.name, f.action, f.amountFROM   person p, calculate_payments(p.id) f;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4958460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存