使用START WITH和CONNECT BY PRIOR从oracle迁移查询到postgresql

时间:2018-03-28 14:51:23

标签: sql postgresql recursive-query

我正在将一个进程从oracle迁移到postgresql,而我在转换它们时遇到了另一个问题。

我一直在研究如何迁移oracle查询,该查询具有“START WITH”和“CONNECT BY PRIOR”,我已经记录了这一点,我认为最简单的方法是使用“WITH RECURSIVE”

进行查询的迁移,但我不确定他们抛出的结果,因为bd oracle和postgres是不同的,并且不可能同意bd。

这是Oracle中的查询

SELECT edef_codigo, etdf_transac, edef_detail--, LEVEL
FROM edeft
WHERE edef_distrib in('OM', 'N/A')
AND  pers_codigo_socadm = 311745439
AND  ctac_correlativo = 7513
START WITH etdf_transac = 'SDN'
CONNECT BY PRIOR edef_codigo = edef_padre;

这是postgresql中的查询

WITH RECURSIVE edf AS ( SELECT ed.edef_codigo, ed.etdf_transac, 
                               ed.edef_detail
                        FROM edeft ed
                        WHERE ed.edef_distrib in('OM', 'N/A')
                        AND  ed.pers_codigo_socadm = 311745439
                        AND  ed.ctac_correlativo = 7513
                        AND ed.etdf_transac = 'SDN'

                        UNION ALL

                        SELECT ed.edef_codigo, ed.etdf_transac, 
                               ed.edef_detail
                        FROM edeft ed
                             JOIN edf ON edf.edef_codigo = ed.edef_padre    
                        WHERE ed.edef_distrib in('OM', 'N/A')
                        AND  ed.pers_codigo_socadm = 311745439
                        AND  ed.ctac_correlativo = 7513                 
                      )
                    SELECT * FROM edf;

我仍然是postgres的新手,这次咨询让我特别复杂,因为我没有找到类似于我的例子。

1 个答案:

答案 0 :(得分:0)

是的,我还使用了#34;先前连接"使用"使用递归"在Postgresql中进行转换查询我发现这是正确的方法。

参考先前连接的一个简单示例:

甲骨文:

Select name, age from user_test connect by prior user_id=parent_id start with user_id='a';

Postgres的:

with recursive cte_name as 
(select u1.name, u1.user_id, u1.age from user_test u1 where user_id='a' 
UNION ALL select u2.name, u2.user_id, u2.age from user_test u2 
join cte_name on cte_name.user_id=u2.parent_id) select name,age from cte_name;