0

现在我对 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 子句,所以这并不容易。

你能帮我吗?

4

1 回答 1

1

Oracle 查询似乎有一些我无法理解的额外怪癖和条件。它可能与特定的用例有关。

在没有样本数据的情况下,我将向您展示简单的案例。你说:

有一个表 'tblOND' 有 2 列 'oNdId' 和 'parentId' 这是一个层次结构

这是一个根据初始过滤谓词获取所有节点子节点的查询:

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是迭代运行的“迭代”查询,直到它不再返回任何行。

于 2020-06-18T17:19:51.703 回答