oracle 遞迴的使用

2021-06-16 20:06:09 字數 1574 閱讀 7240

oracle資料庫提供給了乙個強大的功能:遞迴

這功能目前在db2中是沒有的。

1. 語法:

select *

from table_name t

start with t.child_id = '***'

connect by prior t.child_id = t.parent_id  (注意:不能寫成 connect by prior t.parent_id = t.child_id  )

2.特別講解:

start with t.child_id = '***'

這句話的意思是以 aaa 開始的行,如果在這個表中 child_id = 'aaa' 的資料有7行,並且parent_id='aaa'的只有一條資料的時候,那麼搜出來的結果集中,就 parent_id='aaa' 的資料就有7條資料;

如果parent_id='aaa'的資料有兩條資料的話,那麼搜出來的結果集中,就 parent_id='aaa' 的資料就有14條資料;

如果parent_id='aaa'的資料有兩條資料的話,還希望搜出兩條資料,那麼就需要加上 distinct 關鍵字(只會對 child_id ,parent_id  兩列起作用 )。

在大多數的情況下,child_id是不會有重複的,所以只要 child_id 不重複就可以不用加 distinct 關鍵字,就可以得到我們想要的結果。

那麼什麼時候我們會用到剛才我講到的情況呢,設定批次依賴的時候。批次依賴總是會遇到這種情況: a批次要同時依賴於b批次,c批次,d批次。

這時候就得這麼設計表了

child_id    parent_id

a                      b

a                      c

a                      d

3.原則

start with 後面是頭,頭可以有多個,也可以有1個,這個看具體的需求了。

如何控制是多個還是乙個呢,在 start with 後 加上 and  條件就可以了。

當然,後面的鏈條也可以按照需求加上你需要的  and 條件。

add by xingshi89 20130720

4. 死迴圈

這個是我昨天下午剛遇到的乙個問題。

本來寫的好好的sql 遞迴查詢語句,以前用的好好的,並且也在生產上執行成功了,今天拿出來用居然不行了。

讓我小鬱悶了一把!!!

原因是在你的資料問題,而不是sql寫的有問題,比如下面這種情況:

有一條資料: parent_id  = 1  ,child_id = 2678  ;

另一條資料: parent_id  = 2678 , child_id = 1 ;

這樣的資料遞迴sql語句是不能執行的!oracle具體報錯的錯誤**我忘記了,這個也不重要了,重要的是大家要記得這種情況,到時候別懷疑自己的sql語句啊,呵呵

oracle使用遞迴的效能提示

oracle使用遞迴的效能提示 當你用start with connect by nocycle prior 進行遞迴查詢資料的時候 www.2cto.com 那麼下面兩段 的效能肯定是有明顯差別的 大家用的時候 請注意了 可以不看下面 直接看我的總結 查詢某個資料夾資料夾id 12裡面的層次數以及...

ORACLE中使用遞迴查詢

在資料庫查詢中常常會碰到要查詢樹形結構的資料,需要用乙個欄位的資料當做下一條記錄的父節點繼續查詢,如果在不知道有多少級節點的情況下一次次手寫sql查詢會很繁瑣而沒有效率,這時可以使用 oracle中的connect with prior遞迴演算法 oracle中start with.connect ...

oracle 遞迴查詢 Oracle遞迴查詢

1.1 建立表與插入資料 create table district id number 10 not null,parent id number 10 name varchar2 255 byte not null alter table district add constraint distr...