oracle 遞歸的使用

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語句啊,呵呵

 

發佈了33 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章