SYS_CONNECT_BY_PATH和START WITH / CONNECT BY PostgreSQL等效

问题描述 投票:0回答:1

我有一个查询是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中做与此相同或类似的事情?

谢谢。

oracle postgresql
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.