处理子查询中的多个 return 值
Handling multiple return values in subquery
我有以下数据:
cte
=================
gp_id | m_ids
------|----------
1 | {123}
2 | {432,222}
3 | {123,222}
还有一个带有这样签名的函数(实际上 returns 不是 table 而是几个 id):
FUNCTION foo(m_ids integer[])
RETURNS TABLE (
first_id integer,
second_id integer
)
现在,我必须遍历每一行并使用该函数执行一些计算,所以我会得到如下结果:
gp_id | first_id | second_id
------|----------|-----------
1 | 25 | 25
2 | 13 | 24
3 | 25 | 11
为此,我尝试了以下代码:
SELECT gp_id,
(
SELECT *
FROM foo(
(
SELECT m_ids
FROM cte c2
WHERE c2.gp_id = c1.gp_id)) limit 1)
FROM cte c1
问题出在 SELECT *
语句中。如果我使用 SELECT first_id
,一切正常(除了我必须 运行 两个连续的查询,显然我想避免),但在前一种情况下我得到了错误
subquery must return only one column
这有点意料之中。
那么如何在一个查询中正确地遍历 table?
在横向连接中使用函数:
select gp_id, first_id, second_id
from cte,
lateral foo(m_ids);
我有以下数据:
cte
=================
gp_id | m_ids
------|----------
1 | {123}
2 | {432,222}
3 | {123,222}
还有一个带有这样签名的函数(实际上 returns 不是 table 而是几个 id):
FUNCTION foo(m_ids integer[])
RETURNS TABLE (
first_id integer,
second_id integer
)
现在,我必须遍历每一行并使用该函数执行一些计算,所以我会得到如下结果:
gp_id | first_id | second_id
------|----------|-----------
1 | 25 | 25
2 | 13 | 24
3 | 25 | 11
为此,我尝试了以下代码:
SELECT gp_id,
(
SELECT *
FROM foo(
(
SELECT m_ids
FROM cte c2
WHERE c2.gp_id = c1.gp_id)) limit 1)
FROM cte c1
问题出在 SELECT *
语句中。如果我使用 SELECT first_id
,一切正常(除了我必须 运行 两个连续的查询,显然我想避免),但在前一种情况下我得到了错误
subquery must return only one column
这有点意料之中。
那么如何在一个查询中正确地遍历 table?
在横向连接中使用函数:
select gp_id, first_id, second_id
from cte,
lateral foo(m_ids);