Oracle中的樹狀查詢 遞迴查詢

2022-03-04 03:29:21 字數 1622 閱讀 1722

舉報資料庫中有乙個表,結構很簡單,如下所示:

表名: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...