在子查询

时间:2017-06-22 11:38:06

标签: sql postgresql postgresql-9.4

我有以下数据:

cte
=================
gp_id | m_ids
------|----------
1     | {123}
2     | {432,222}
3     | {123,222}

具有这样的签名的函数(实际上它不返回表而是返回几个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,一切都运作良好(除了我必须运行两个连续的查询,我很想避免,显然),但在前一种情况下,我得到了错误

  

子查询必须只返回一列

有点期待。
那么如何在一个查询中正确迭代表?

1 个答案:

答案 0 :(得分:1)

在横向连接中使用该功能:

select gp_id, first_id, second_id
from cte, 
lateral foo(m_ids);