,我有以下數據:遍歷表遞歸查詢
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
爲什麼你不能在沒有任何改變的情況下複製CTE?你不會在你的問題中的任何地方解釋它。我們也沒有看到功能的全部,所以不能說如何得到想要的結果。這個子選擇背後的推理是什麼?你想達到什麼目的? –
@ŁukaszKamiński我不能複製CTE,因爲在'where id = any(m_ids)'語句m_ids是在函數中傳遞的參數。 –