sql—如何将connect by PREVIR oracle风格的查询重写为递归cte postgres,以便使用相关where子句进行查询?

fykwrbwg  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(292)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

10个月前关门了。
改进这个问题
现在,我有以下针对oracle的工作查询:

select * from (
          select orgId, oNdId, stamp, op,
                 lgin, qwe, rty,
                 tusid, tnid, teid, 
                 thid, tehid, trid,
                 name1, name2,
                 xtrdta, rownum as rnum from 
          (
            select a.*
            from tblADT a 
            where a.orgId=? and  EXISTS(
            SELECT oNdId, prmsn FROM (
                SELECT oNdId, rp.prmsn FROM tblOND
                LEFT JOIN tblRoleprmsn rp ON rp.roleId=? AND rp.prmsn='vors'
                START WITH oNdId IN (
                    SELECT oNdId FROM tblrnpmsn rnp
                    WHERE rnp.roleId=?
                    AND rnp.prmsn=?
                )
            CONNECT BY PRIOR oNdId = parentId
            )
            WHERE oNdId = a.oNdId OR 1 = (
                CASE WHEN prmsn IS NOT NULL THEN
                    CASE WHEN a.oNdId IS NULL THEN 1 ELSE 0 END
                END
            )
        )               
             AND op IN (?)
            order by stamp desc
          ) WHERE rownum < (? + ? + 1)
        ) WHERE rnum >= (? + 1)

目前,我正在尝试为postresql实现模拟。根据我的调查,我可以使用递归cte。
但我并不成功。我找到的示例都没有where子句,所以不太容易。
你能帮我一下吗?

gt0wga4j

gt0wga4j1#

oracle查询似乎有一些我无法理解的额外的怪癖和条件。它可能与特定的用例有关。
在没有样本数据的情况下,我将向您展示一个简单的案例。你说:
有一个表'tblond',它有两列'ondid'和'parentid',这是一个层次结构
根据一个初始筛选 predicate ,下面的查询将获取节点的所有子节点:

create table tblond (
  ondid int primary key not null, 
  parentid int foreign key references tblond (ondid)
);

with recursive
n as (
  select ondid, parentid, 1 as lvl
  from tblond
  where <search_predicate> -- initial nodes
 union all
  select t.ondid, t.parentid, n.lvl + 1
  from n
  join tblond t on t.parentid = n.ondid -- #1
)
select * from n

递归CTE不限于层次结构,而是任何类型的图。只要你能描绘出“走”到下一个节点的关系( #1 )您可以继续添加行。
该示例还显示了一个“虚构”列 lvl ; 您可以根据需要/需要生成任意多的列。
前一节 UNION ALL 是只运行一次的“锚定”查询。之后 UNION ALL 是以迭代方式运行直到不再返回任何行的“迭代”查询。

相关问题