舉報資料庫中有乙個表,結構很簡單,如下所示:
表名:tbinvoice
字段:id
name
parent_id
每一行記錄表示乙個發票,parent_id表示它的父物件id,假設現在表中有如下資料:
id
name
parent_id
1張三
2李四1
3王五1
4張一2
5王三2
6武松3
7李四4
8朱大5
9曾子5
10常三6
這樣就形成了如下乙個樹,我們暫且稱它們為乙個家族吧。12
3456
78910
現在有這樣乙個需求,給定乙個id,要查出這個id所述家族中的所有id,比方說無論是給定1-10中的哪乙個id,都必須查出這個家族中的所有id,並且不能出現別的家族中的id。這裡我們可以使用oracle自帶的樹狀查詢函式:
select …..
connect by
[start with];
現在以id=5為例,要求查出它所屬家族中的所有id。
思路:在家族書中進行回溯,向上查詢,得到祖先id
首先我們用如下的語句:
select id from tbinvoice
connect by id=prior parentid start with id=5,這條語句從id=5處向上查詢,一直到祖先節點為止。在本表中所有的頂層節點的parentid都是null
接著我們利用下面的語句得到祖先節點的id
select id
from
(select id from tbinvoice connect
by id=prior parentid start with id=5)
where parentid is
null
這樣我們就得到了id 5所屬家族的祖先id。
最後,我們就需要根據祖先id向下進行查詢,得到所有的子id了
select id from tbinvoice
connect by prior id=parentid start with id=
(select id
from
(select id from tbinvoice connect
by id=prior parentid start with id=5)
where parentid is
null)
如此一來我們就可以得到id 5所屬家族中的所有id了。
在整個過程,起關鍵作用的就是prior這個關鍵字,它代表什麼意思呢?它的英文意思為「優先的」,在這裡可以這樣理解:
當prior在parentid之前時,說明parentid優先,如果start with id=5,那麼從id=5的那條記錄開始查詢,後面的記錄都必須是id等於前面記錄的parentid,這樣就表明是向上進行查詢,追溯它所有的祖先。
當prior在id之前時,說明id優先,如果start with id=5,那麼從id=5的那條記錄開始查詢,後面的記錄都必須是parentid=前面記錄的id,這就相當於是向下進行,尋找它所有的子孫。
樹狀遞迴查詢
樹狀等級查詢 所有資料 從mysql裡面輸出的全部是字串型別 list array array cat id 8 cat name 分類fff sort order 30 parent id 1 array cat id 1 cat name 分類aaa sort order 50 parent i...
Oracle中的遞迴查詢
我們假設有如下一張機構表 org 字段型別 欄位名稱 字段描述 number 16 id 機構id number 16 parent id 父機構id varchar2 100 name 機構名稱 number 1 enable 是否啟用,1表示啟用,0表示停用 表中有如下幾行資料 id paren...
oracle中的遞迴查詢
oracle遞迴查詢 oracle中start by prior子句用法 connect by 是結構化查詢中用到的,其基本語法是 select from tablename start with 條件1 connect by 條件2 where 條件3 例 select from table st...