標籤:
文法:
select *from tablename t start with column = ?connect by [prior] t.id = [prior] t.parentid
例如:菜單表,表結構如下
資料如下:
一、從上向下查
1、查詢某個指定id的所有下級菜單
select * from tb_menu tstart with t."PARENT" = 1connect by prior t."ID" = t."PARENT"
註:從上向下查,就是指定某個節點,查詢其下所有的子節點(包含直接子節點和非直接子節點),故start with 條件接parent = ?;
而connect by是指定遞迴時記錄與記錄間的關係;
最重要的區分是prior:從上向下查,1作為parent,故將prior放在parent欄位的另外一邊,即表示查詢所有的子條目
:
2、查詢某個指定id的所有下級菜單及該指定id的菜單資訊
select * from tb_menu tstart with t.id = 1connect by prior t."ID" = t."PARENT"
註:從上向下查詢,尋找某個指定節點下的所有子節點和該指定節點,故start with條件指定id = ?,表示id = ?的資料開始向下查詢(包含指定id條目)。
而connect by是指定遞迴時記錄與記錄間的關係;
最重要的區分是prior:從上向下查,1作為parent,故將prior放在parent欄位的另外一邊,即表示查詢所有的子條目
:
二、從下向上查詢
1、查詢某個指定id的所有上級菜單
select * from tb_menu tstart with t.id = 42connect by t."ID" = prior t."PARENT"
註:從下向上查詢,只有“包含該條記錄”的查詢,這點同從上向下查詢不同
prior的位置:將42看作id,擷取其所有的parent,所以將prior放在parent一邊
:
三、總結
1、從上向下查詢,可以有兩種結果:包含指定條目、不包含指定條目
2、從下向上查詢,只有一種個結果:包含指定條目
3、prior的位置:
從上向下查詢:start with column = ?
?是作為父級,prior放在子級一邊,表示查詢所有的子級
從下向上查詢:start with column = ?
?是作為子級,prior放在父級一邊,表示查詢所有的父級
oracle遞迴查詢