1. 程式人生 > >db2和oracle中的樹查詢(遞迴查詢)語句

db2和oracle中的樹查詢(遞迴查詢)語句

 在db2和oracle中的對樹的遞迴查詢語句。
表結構:
create table  MAIN_NODE (
MLA_ID               INTEGER     not null        ,   //節點ID
MLA_ROOTID          INTEGER,                      //根節點ID
MLA_PARENTID        INTEGER,                      //父節點ID
MLA_NAME            VARCHAR2(50),                //節點名稱
constraint P_mlaid primary key (MLA_ID) );
MLA_ID   MLA_PARENTID  MLA_ROOTID   MLA_NAME
1           0                   0             父節點1    
2           1                   0            (父節點1的/)子節點1  
3            2                   0            (父節點1的/子節點1的/)孫子節點1
4           0                   0             父節點2    
5           4                   0            (父節點2的/)子節點1  
樹結構直觀圖:
根節點(0)
     父節點1(1)
           (父節點1的/)子節點1(2) 
                     (父節點1的/子節點1的/)孫子節點1(3)
     父節點2(4)
           (父節點2的/)子節點1(5)
語句要求的功能:實現給出一個父節點id然後得到該父節點下的所有子節點的資訊Db2 的查詢語句:
WITH  RPL (mla_parentid, mla_id, mla_name) AS
(
SELECT ROOT.mla_parentid, ROOT.mla_id, ROOT.mla_name FROM main_node ROOT WHERE ROOT.mla_id = ?
UNION  ALL
SELECT CHILD.mla_parentid, CHILD.mla_id, CHILD.mla_name FROM RPL PARENT, main_node CHILD WHERE PARENT.mla_parentid = CHILD.mla_id
)
SELECT DISTINCT mla_parentid, mla_id, mla_name FROM RPL ORDER BY mla_parentid, mla_id, mla_name
讓我們研究這個查詢語句:
RPL 作為一個具有以下三列的虛擬表:mla_parentid, mla_id 和 mla_name。
WITH 子句內的第一個 SELECT 語句是初始化表。它只執行一次。它的結果形成虛擬表的初始內容以作為遞迴的種子。在上面的示例中,種子是 mla_id 為 任意傳進去的引數 的一行或多行。
第 二個 SELECT 語句執行多次。將種子作為輸入(JOIN 中的輔助表)傳遞給第二個 SELECT 語句以產生下一個行集合。將 JOIN 的結果新增(UNION ALL)到虛擬表的當前內容中,並放回到其中以形成用於下一次傳遞的輸入。只要有行產生,這個過程就會繼續。
如果期望,虛擬表上最後的 SELECT 允許我們選擇遞迴查詢所產生的所有行或僅部分行。
Oracle的查詢語句:
   select mla_parentid, mla_id, mla_name from main_node
start with mla_id=? connect by prior mla_id=mla_parentid
讓我們研究這個查詢語句:
  本語句實際上是 start with ...connect by 的用法, start with 後面所跟的就是就是遞迴的種子。在上面的示例中,種子是 mla_id 為 任意傳進去的引數
connect by 後面的"prior"如果預設:則只能查詢到符合條件的起始行,並不進行遞迴查詢;
connect by prior 後面所放的欄位是有關係的,它指明瞭查詢的方向。如果後面放的是 mla_id=mla_parentid 則表明從本節點查向葉子節點;如果後面放的是 mla_parentid = mla_id則表明從根節點查向本節點;