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