我正在将一个进程从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的新手,这次咨询让我特别复杂,因为我没有找到类似于我的例子。
答案 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;