我正在将一个进程从oracle迁移到postgresql,并且我遇到了另一个转换问题。
我一直在研究如何迁移oracle查询,它有"START WITH“和"CONNECT BY the”,我已经记录了关于这一点的文档,我认为最简单的方法是“使用递归”。
进行查询的迁移,但我不确定它们抛出的结果,因为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的新手,这次咨询让我变得特别复杂,因为我还没有找到与我所拥有的类似的例子。
发布于 2018-05-23 14:57:35
是的,我也在Postgresql中使用了"With Recursive“查询的"Connect by prior”转换,我发现这是正确的方法。
引用connect by prior的一个简单示例:
Oracle:
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;https://stackoverflow.com/questions/49537740
复制相似问题