SYS_CONNECT_BY_PATH和STARTgre / CONNECT BY PostgreSQL等效

时间:2015-07-17 14:27:40

标签: oracle postgresql

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

感谢。

1 个答案:

答案 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;