Posted on 2007-04-28 19:46
leekiang 閱讀(1648)
評論(0) 編輯 收藏 所屬分類:
sql
有張表,有兩個(gè)字段: id,patentid,他們分別記錄了這條記錄的id,以及父id號,
如何根據(jù)最頂層的id找到所有的id,包括子id,孫子id,以及重孫id.
--用遞歸查詢
SELECT ID, PARENTID FROM tablename
Start With ID = 'xxx'
Connect By Prior ID = ParentId
以下轉(zhuǎn)自http://blog.csdn.net/apicescn/archive/2007/02/16/1510922.aspx
connect by 是結(jié)構(gòu)化查詢中用到的,其基本語法是:
select ... from tablename start by cond1
connect by cond2
where cond3;
簡單說來是將一個(gè)樹狀結(jié)構(gòu)存儲(chǔ)在一張表里,比如一個(gè)表中存在兩個(gè)字段:
id,parentid那么通過表示每一條記錄的parent是誰,就可以形成一個(gè)樹狀結(jié)構(gòu)。
用上述語法的查詢可以取得這棵樹的所有記錄。
其中COND1是根結(jié)點(diǎn)的限定語句,當(dāng)然可以放寬限定條件,以取得多個(gè)根結(jié)點(diǎn),實(shí)際就是多棵樹。
COND2是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。
COND3是過濾條件,用于對返回的所有記錄進(jìn)行過濾。
PRIOR和START WITH關(guān)鍵字是可選項(xiàng)
PRIORY運(yùn)算符必須放置在連接關(guān)系的兩列中某一個(gè)的前面。對于節(jié)點(diǎn)間的父子關(guān)系,PRIOR
運(yùn)算符在一側(cè)表示父節(jié)點(diǎn),在另一側(cè)表示子節(jié)點(diǎn),從而確定查找樹結(jié)構(gòu)是的順序是自頂向下還是
自底向上。在連接關(guān)系中,除了可以使用列名外,還允許使用列表達(dá)式。START WITH 子句為
可選項(xiàng),用來標(biāo)識哪個(gè)節(jié)點(diǎn)作為查找樹型結(jié)構(gòu)的根節(jié)點(diǎn)。若該子句被省略,則表示所有滿足查詢
條件的行作為根節(jié)點(diǎn)。
完整的例子如SELECT PID,ID,NAME FROM T_WF_ENG_WFKIND START WITH PID =0 CONNECT BY PRIOR ID = PID
以上主要是針對上層對下層的順向遞歸查詢而使用start with ... connect by prior ...這種方式,但有時(shí)在需求需要的時(shí)候,可能會(huì)需要由下層向上層的逆向遞歸查詢,此是語句就有所變化:例如要實(shí)現(xiàn) select * from table where id in ('0','01','0101','0203','0304') ;現(xiàn)在想把0304的上一級03給遞歸出來,0203的上一級02給遞歸出來,而01現(xiàn)在已經(jīng)是存在的,最高層為0.而這張table不僅僅這些數(shù)據(jù),但我現(xiàn)在只需要('0','01','0101','0203','0304','02','03')這些數(shù)據(jù),此時(shí)語句可以這樣寫SELECT PID,ID,NAME FROM V_WF_WFKIND_TREE WHERE ID IN (SELECT DISTINCT(ID) ID FROM V_WF_WFKIND_TREE CONNECT BY PRIOR PID = ID START WITH ID IN ('0','01','0101','0203','0304') );
其中START WITH ID IN里面的值也可以替換SELECT 子查詢語句.
http://topic.csdn.net/t/20050319/17/3864428.html
http://blog.csdn.net/Bogues/archive/2005/10/28/518590.aspx