可返回的CONNECT BY PRIOR(SQL)

时间:2012-09-18 07:23:35

标签: sql oracle11g

我有一个结构(例如,括号(id,parent_id)):

  • 目录1(1,0)
  • 子目录1(44,1)
  • 第1项(83,44)
  • 第2项(98,44)
  • 子目录2(46,1)
  • 第1项(8,46)
  • 第2项(9,46)
  • 目录2(4,0)
  • 子目录1(54,4)
  • 第1项(43,44)
  • 第2项(48,54)
  • 子目录2(101,4)
  • 第1项(19,101)
  • 第2项(314,101)

在输入中我有id列表 如果我没有id父目录,但我有子id,那么我必须显示所有祖先: 例如: 输入:83,46,43,48 输出:

  • 目录1(1,0)
  • 子目录1(44,1)
  • 第1项(83,44)
  • 子目录2(46,1)
  • 目录2(4,0)
  • 子目录1(54,4)
  • 第1项(43,44)
  • 第2项(48,54)

我发明了请求:

SELECT * 
  FROM (SELECT distinct * 
          FROM Table a 
          START WITH N in (83, 46, 43, 48) CONNECT BY PRIOR N_PARENT = N) a 
          START WITH N_PARENT in 0 CONNECT BY PRIOR N = N_PARENT
         ORDER SIBLINGS BY N
但是在大数据方面却很慢。我可以使用一个CONNECT BY提出请求吗?

1 个答案:

答案 0 :(得分:2)

with tree as ( 
 SELECT t.name, t.id, t.parent, LEVEL lvl, connect_by_root(id) root
   FROM t
CONNECT BY PRIOR parent = id
  START WITH id IN (83, 98, 46, 43, 48)
), ordered_tree as (
 select name, 
        id, 
        parent,
        row_number() over (partition by id order by id) rn
   from tree 
  order by root, lvl desc
)
select name, id, parent
 from ordered_tree where rn = 1 

http://sqlfiddle.com/#!4/34f2d/4