Related to Oracle SQL 關於樹形資料的遍歷

coolhe發表於2011-08-02

有這樣一組資料:

  1. ID      COL1    PARID   HAS_CHILD  
  2. 001 a   0   1  
  3. 002 b   0   1  
  4. 003 c   001 0  
  5. 004 d   001 0  
  6. 005 e   002 1  
  7. 006 f   002 0  
  8. 007 g   005 0  
  9. 008 h   005 0  

希望以中序遍歷的方式得出以下遍歷結果:

  1. 001 a   0   1  
  2. 003 c   001 0  
  3. 004 d   001 0  
  4. 002 b   0   1  
  5. 005 e   002 1  
  6. 007 g   005 0  
  7. 008 h   005 0  
  8. 006 f   002 0  
  9. 005 e   002 1  
  10. 007 g   005 0  
  11. 008 h   005 0  

這其實是多棵樹,001,002,以及002的子樹005,得到的是他們的遍歷結果:

 

使用的SQL語句如下:

SELECT id, col1, parid, has_child 
  FROM test t
CONNECT BY PRIOR id = parid -- 這句的作用是確定連線條件,PRIOR 放在ID前是從根開始遍歷,如果PRIOR 放在parid前則是從根進行遍歷,但是這實際上只能遍歷從葉節點往上的樹的一枝的資料。

 START WITH has_child = 1  -- 這句的作用是確定符合根節點的條件

 ORDER SIBLINGS BY id -- 對同一父節點下的子節點進行排序,如果只是使用普通的order會使結果又變成一個普通的沒有層次的資料。

 

建表SQL:

-- Create table
create table TEST
(
  ID        VARCHAR2(20),
  COL1      VARCHAR2(20),
  PARID     VARCHAR2(20),
  HAS_CHILD NUMBER
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

 

測試資料SQL:

insert into test (ID, COL1, PARID, HAS_CHILD, ROWID)
values ('001', 'a', '0', 1, '');

insert into test (ID, COL1, PARID, HAS_CHILD, ROWID)
values ('002', 'b', '0', 1, '');

insert into test (ID, COL1, PARID, HAS_CHILD, ROWID)
values ('003', 'c', '001', 0, '');

insert into test (ID, COL1, PARID, HAS_CHILD, ROWID)
values ('004', 'd', '001', 0, '');

insert into test (ID, COL1, PARID, HAS_CHILD, ROWID)
values ('005', 'e', '002', 1, '');

insert into test (ID, COL1, PARID, HAS_CHILD, ROWID)
values ('006', 'f', '002', 0, '');

insert into test (ID, COL1, PARID, HAS_CHILD, ROWID)
values ('007', 'g', '005', 0, '');

insert into test (ID, COL1, PARID, HAS_CHILD, ROWID)
values ('008', 'h', '005', 0, '');

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3090/viewspace-703848/,如需轉載,請註明出處,否則將追究法律責任。

相關文章