我有一个查询是一个用 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()
函数,但我不认为它做了 start with 和 connect by bits 所做的事情。我也知道 Postgres 等同于 LTRIM()
是什么,但是如果我必须使用 CONNECTBY()
或类似的东西,我不确定是否修剪字符串很重要。
通过阅读和搜索,我注意到可能有一种方法可以通过一些递归选择来执行此操作,但我不确定我将如何执行此操作,除此之外,我并不真正理解代码的作用。我的假设是它与基于 Oracle 等效项的分层树有关,但即便如此我也不确定。我如何在 Postgres 中执行与此等效或类似的操作?
谢谢。
最佳答案
使用 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;
关于oracle - SYS_CONNECT_BY_PATH 和 START WITH/CONNECT BY PostgreSQL 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31478176/