【问题标题】:SYS_CONNECT_BY_PATH and START WITH/CONNECT BY PostgreSQL EquivalentSYS_CONNECT_BY_PATH 和 START WITH/CONNECT BY PostgreSQL 等效
【发布时间】:2015-07-17 14:27:39
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: oracle postgresql


    【解决方案1】:

    使用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;
    

    【讨论】:

    • 甜,我会试试这个。谢谢。
    • 我帖子中的select 子查询是with..select 查询的一部分。我可以放置另一个with 来代替with..select 查询的select 部分吗? (如with..with..select
    • @BJ:把它们堆起来with recursive your_cte as ( ...), tree as (...) select ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2015-03-22
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多