2012-09-18 31 views
0

我具有這樣的結構(例如,在括號(ID,PARENT_ID)):可回收CONNECT BY PRIOR(SQL)

  • 指南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項(19101)
  • 項目2(314101)

在輸入我的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嗎?

回答

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