我试图联接返回行的表和函数:
SELECT p.id, p.name, f.action, f.amount
FROM person p
JOIN calculate_payments(p.id) f(id, action, amount) ON (f.id = p.id);
该函数为每个ID返回0、1或更多行。该查询适用于PostgreSQL 9.3,但在 9.1 上显示以下错误:
ERROR: invalid reference to FROM-clause entry for table "p" HINT: There is an entry for table "p", but it cannot be referenced from
this part of the query
我无法将计算从函数移到查询中。
据我了解,我无法使用 JOIN LATERAL ,这是9.3中的新功能。
有没有解决此问题的方法?
在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查询计划器的弱点,导致每列对该函数进行一次评估:
或您的情况:
SELECT p.id, p.name
, (calculate_payments(p.id)).action
, (calculate_payments(p.id)).amount
FROM person p
同样的问题:多重评估。
确切地说,pg 9.3+中的解决方案的等效项是:
SELECT p.id, p.name, f.action, f.amount
FROM person p
LEFT JOIN LATERAL calculate_payments(p.id) f ON TRUE;
在函数返回0行的结果中保留行。
如果您对此不关心,则可以在9.3+版中进行简化:
SELECT p.id, p.name, f.action, f.amount
FROM person p, calculate_payments(p.id) f;
问题内容: 我试图在postgres函数内返回查询结果。我尝试了一下,并完美地工作了: 问题是我需要一些东西来返回以下结果: 我需要什么回报,或者应该改变什么才能实现这一目标? 问题答案: 这可以通过一个简单的SQL函数来完成: 可以在手册中找到更多详细信息和示例:http : //www.postgresql.org/docs/current/static/xfunc-sql.html#XFUN
我对Firebase/Firestore/Cloud函数相当陌生,一直在尝试一个小项目,在这个项目中,客户端应用程序调用Firebase Cloud函数来生成一些随机键(随机数),将它们添加到Firestore,成功编写后,将这些键返回到客户端应用程序。有点像随机数发生器。 客户端正确调用该函数(根据Firebase控制台),确实生成密钥,检查它们是否存在于Fi还原中,如果不添加它们。所有的工作直
我正在尝试将十六进制转换为二进制,并接收具有以下功能的文本文件: 3c011001 34300000 8e080000 20090003 11200004 但它在同一行输出二进制文件: 0011 1100 0000 0001 0001 0000 0000 0001 0011 0100 0011 0000 0000 0000 0000 0000 1000 1110 0000 1000 0000 00
问题内容: 将felixge的mysql用于node.js时,如何向结果对象询问返回的行数?我有一个相当昂贵的查询,所以我不想先运行,只是想再运行一次查询。 问题答案: 如果这是一个选择查询,则只需取返回数组的长度即可。 如果是更新/删除查询,则返回的字典将具有受影响的行变量。
问题内容: 我正在尝试从CSV文件中的一组数字中找到最大值和最小值。我的代码在某些行中始终为Max函数返回错误的数字。这是我的代码: 我的输出示例: 我不确定我做错了什么。一些建议,将不胜感激。 问题答案: 您的列表元素是字符串。您需要对其进行转换,以避免按字典顺序进行比较(按字母顺序,一次只比较一个字符,这是因为) 除非您实际上想要字符串,否则不要创建新列表,而只需传递给您的函数即可: