您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

在Postgres :@H_403_1@

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

您的函数具有定义明确的带有列名的返回类型(id, action, amount)-问题中缺少信息。 还要假设您的函数始终返回与id进给相同的函数在这种情况下这是多余的,并且可能已经过优化)。@H_403_1@

同样 ,但更为冗长:@H_403_1@

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+中的新功能。@H_403_1@

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

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

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

或您的情况:@H_403_1@

SELECT p.id, p.name
     , (calculate_payments(p.id)).action
     , (calculate_payments(p.id)).amount
FROM   person p

同样的问题:多重评估。@H_403_1@

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

SELECT p.id, p.name, f.action, f.amount
FROM   person p
LEFT   JOIN LATERAL calculate_payments(p.id) f ON TRUE;

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

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

SELECT p.id, p.name, f.action, f.amount
FROM   person p, calculate_payments(p.id) f;
其他 2022/1/1 18:44:13 有472人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶