我有一个查询是Oracle编写的一个更大的查询的一部分,我需要转换为PostgreSQL。
/*rn and cnt are defined earlier*/
SELECT wtn, LTRIM(SYS_CONNECT_BY_PATH(RESP_TCSI, ','),',') TCSI_CODES
FROM DATA
WHERE rn = cnt
START WITH rn = 1
CONNECT BY PRIOR rn = rn-1
AND PRIOR WTN = WTN
据我所知,Postgres中没有等同于SYS_CONNECT_BY_PATH()
的内容。我知道Postgres在tablefunc中有一个CONNECTBY()
函数,但我不认为它的作用是开头和按位连接。我也知道Postgres与LTRIM()
相当的是什么,但如果我必须使用CONNECTBY()
或类似的东西,我不确定修剪字符串是否重要。
阅读和搜索我注意到有一种方法可以用一些递归选择来做到这一点,但我不确定我会怎么做,除此之外,我真的不明白代码在做什么。我的假设是它与基于Oracle等价物的分层树有关,但即便如此,我也不确定。我如何在Postgres中做与此相同或类似的事情?
感谢。
答案 0 :(得分:3)
使用recursive common table expression:
with recursive tree as (
select wtn,
resp_tcsi as tcsi_codes
from data
where rn = 1 -- this is the "start with" part
union all
select ch.wtn,
p.tcsi_codes||','||ch.resp_tcsi
from data as ch
join tree p
on ch.rn -1 = p.rn -- this is the "connect by" part
and ch.wtn = p.wtn
)
select *
from tree;