0

我有一个结构(例如,在括号中 (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,54)
  • 项目 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,54)
  • 项目 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吗?

4

1 回答 1

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

于 2012-09-18T08:03:04.007 回答