2017-06-23 238 views
0

,我有以下數據:遍歷表遞歸查詢

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

和一個功能foobar(m_ids integer[])。該功能包含以下CTE:

with RECURSIVE foo as (
    select id, p_id, name from bar where id = any(m_ids) 
    union all 
    select b.id, b.p_id, b.name from bar b join foo f on f.p_id = b.id 
) 

功能正在使用一種像這樣:

select foobar(m_ids) from cte1; 

現在,作爲提高性能的過程的一部分,我被告知要擺脫功能。我的計劃是在我的cte鏈中使用cte foo,但我堅持試圖調整any(m_ids)的使用。

編輯:要清楚,問題是,那些在where id = any(m_ids)語句中使用m_ids是函數的參數,所以我就以使其功能外工作變換CTE。

我想到了以下幾點:

with RECURSIVE foo as (
    select (select id, p_id, name from bar where id = any(cte1.m_ids) 
    union all 
    select b.id, b.p_id, b.name from bar b join foo f on f.p_id = b.id) 
    from cte1 
) 

但是,這是行不通的,因爲
1)recursive query "foo" does not have the form non-recursive-term UNION [ALL] recursive-term
2)subquery must return only one column

最後,我希望得到我的數據,形式如下:

m_ids |foobar_result 
---------|------------- 
{123} | 125   
{432,222}| 215   
+0

爲什麼你不能在沒有任何改變的情況下複製CTE?你不會在你的問題中的任何地方解釋它。我們也沒有看到功能的全部,所以不能說如何得到想要的結果。這個子選擇背後的推理是什麼?你想達到什麼目的? –

+0

@ŁukaszKamiński我不能複製CTE,因爲在'where id = any(m_ids)'語句m_ids是在函數中傳遞的參數。 –

回答

1

也許JOIN那個表持有參數?

with RECURSIVE foo as (
    select m_ids, id, p_id, name from bar 
    JOIN cte1 ON id = ANY(m_ids) 
    union all 
    select m_ids, b.id, b.p_id, b.name from bar b join foo f on f.p_id = b.id 
) 
+0

非常感謝!我不想考慮加入自己感到尷尬:D –