Oracle Start With关键字
Oracle Start With關(guān)鍵字
前言
旨在記錄一些Oracle使用中遇到的各種各樣的問題. 同時希望能幫到和我遇到同樣問題的人.Start With (樹查詢)
問題描述:
在數(shù)據(jù)庫中, 有一種比較常見得 設(shè)計(jì)模式, 層級結(jié)構(gòu) 設(shè)計(jì)模式, 具體到 Oracle table中, 字段特點(diǎn)如下:
ID, DSC, PID;
三個字段, 分別表示 當(dāng)前標(biāo)識的 ID(主鍵), DSC 當(dāng)前標(biāo)識的描述, PID 其父級ID, 比較典型的例子 是 國家, 省, 市 這種層級結(jié)構(gòu);
省份歸屬于國家, 因此 PID 為 國家的 ID, 以此類推;
create table DEMO (ID varchar2(10) primary key,DSC varchar2(100),PID varchar2(10)
)
--插入幾條數(shù)據(jù)Insert Into DEMO values ('00001', '中國', '-1');
Insert Into DEMO values ('00011', '陜西', '00001');
Insert Into DEMO values ('00012', '貴州', '00001');
Insert Into DEMO values ('00013', '河南', '00001');
Insert Into DEMO values ('00111', '西安', '00011');
Insert Into DEMO values ('00112', '咸陽', '00011');
Insert Into DEMO values ('00113', '延安', '00011');
這樣子就成了一個簡單的樹級結(jié)構(gòu), 我一般將 根節(jié)點(diǎn)的 PID 定為 -1;
Start With:
參考鏈接:?http://blog.csdn.net/weiwenhp/article/details/8218091
基本語法如下:
SELECT ... FROM + 表名
WHERE + 條件3
START WITH + 條件1
CONNECT BY PRIOR + 條件2--示例
Select * From DEMO
Start With ID = '00001'
Connect By Prior ID = PID
條件1: 表示從哪個節(jié)點(diǎn)開始查找, 也就是通過條件1 查詢到的數(shù)據(jù), 作為后續(xù)查詢的起始節(jié)點(diǎn)(參數(shù)).
當(dāng)然可以放寬限定條件,如 ID in ('00001', '00011')以取得多個根節(jié)點(diǎn),也就是多棵樹;在連接關(guān)系中,除了可以使用列明外,還允許使用列表達(dá)式。
如果省略Start With
就默認(rèn)把所有滿足查詢條件的Tree整個表中的數(shù)據(jù)從頭到尾遍歷一次,每一個數(shù)據(jù)做一次根,然后遍歷樹中其他節(jié)點(diǎn)信息.
條件2: 是連接條件,其中用PRIOR表示上一條記錄,例如CONNECT BY PRIOR ID = PID,意思就是上一條記錄的ID是本條記錄的PID,即本記錄的父親是上一條記錄。CONNECT BY子句說明每行數(shù)據(jù)將是按照層次順序檢索,并規(guī)定將表中的數(shù)據(jù)連入樹形結(jié)構(gòu)的關(guān)系中。
Prior 在父節(jié)點(diǎn)的一側(cè)表示, 自底向上查, 在 子節(jié)點(diǎn)的一側(cè)表示 自上向下查詢;
條件3: 不能用在 Connect By 后, 這里的條件判斷, 等價于 在最后查詢出結(jié)果列表之后, 再進(jìn)行條件篩選; 并非 刪除掉 節(jié)點(diǎn)及子節(jié)點(diǎn);
--自底向上
Select * From DEMO
Start With ID = '00113'
Connect By Prior PID = ID--結(jié)果
00113 延安 00011
00011 陜西 00001
00001 中國 -1--自上向下
Select * From DEMO
Start With ID = '00001'
--用 Start Wiht PID = '-1' 結(jié)果不變
Connect By Prior ID = PID--結(jié)果
00001 中國 -1
00011 陜西 00001
00111 西安 00011
00112 咸陽 00011
00113 延安 00011
00012 貴州 00001
00013 河南 00001--Where 刪除
Select ID, PID, DSC
From DEMO
WHERE ID <> '00011'
Start With ID = '00001'
Connect By Prior ID = PID--結(jié)果
00001 -1 中國
00111 00011 西安
00112 00011 咸陽
00113 00011 延安
00012 00001 貴州
00013 00001 河南
下面是幾條關(guān)鍵字特殊點(diǎn):
nocycle關(guān)鍵字, 有時候數(shù)據(jù)本身 不合理會導(dǎo)致出現(xiàn)循環(huán)的問題, 如 將上述的 ID '00001' 記錄的 'PID' 也改為 '00001', 會出現(xiàn)循環(huán)的問題, 這是, 需要用到 nocycle 即可消除循環(huán);
Connect By nocycle Prior ID = PID 即可.
connect_by_isleaf 表示當(dāng)前節(jié)點(diǎn)是否是葉子節(jié)點(diǎn)
level 表示當(dāng)前節(jié)點(diǎn)所處層級, 這里的層級指的是 從 start with 查詢到的節(jié)點(diǎn)開始往下算起, 當(dāng)前屬于第幾層級
Select ID, PID, DSC,
connect_by_isleaf isLeaf,
LEVEL
From DEMO
Connect By nocycle Prior ID = PID
Start With ID = '00001';--結(jié)果
ID PID DSC isLeaf LEVEL
00001 00001 中國 0 0
00011 00001 陜西 0 1
00111 00011 西安 1 2
00112 00011 咸陽 1 2
00113 00011 延安 1 2
00012 00001 貴州 1 1
00013 00001 河南 1 1
這里需要注意的一個點(diǎn), 如果采用的是 自底向上的 方式查詢, 則 LEVEL 的 層級 同樣是 從底向上, 如 00113 LEVEL 1 00011 LEVEL 2 00001 LEVEL 3. 另外一點(diǎn): 如果在查詢語句中 Select ID, PID, DSC, connect_by_isleaf isLeaf, LEVEL - 1 LEVEL 這種查詢方式的話, 在 WHERE 判斷條件中, 只需要判斷 LEVEL = 1, 就可以取出 當(dāng)前查詢節(jié)點(diǎn)的 子節(jié)點(diǎn)(由于LEVEL 也是 偽列, 需要用子查詢的方式);
SIBLINGS關(guān)鍵字:它會保護(hù)層次,并且在每個等級中按expre排序。
Select ID, PID, DSC,
connect_by_isleaf,
LEVEL
From DEMO
Start With ID = '00001'
Connect By nocycle Prior ID = PID
ORDER By DSC--結(jié)果, 僅貼出部分?jǐn)?shù)據(jù)(層級結(jié)構(gòu)被破壞了)
00012 00001 貴州 1 2
00013 00001 河南 1 2
00011 00001 陜西 0 2
00111 00011 西安 1 3
00112 00011 咸陽 1 3
00113 00011 延安 1 3
00001 -1 中國 0 1--ORDER SIBLINGS By DSC
Select ID, PID, DSC,
connect_by_isleaf,
LEVEL
From DEMO
Start With ID = '00001'
Connect By nocycle Prior ID = PID
ORDER SIBLINGS By DSC--結(jié)果(Level 層級不變)
00001 -1 中國 0 1
00012 00001 貴州 1 2
00013 00001 河南 1 2
00011 00001 陜西 0 2
00111 00011 西安 1 3
00112 00011 咸陽 1 3
00113 00011 延安 1 3
connect_by_iscycle:存在循環(huán),將返回1,否則返回0
總結(jié)
以上是生活随笔為你收集整理的Oracle Start With关键字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国互联网+光伏发电行业商业模式创新与投
- 下一篇: 中国互联网+固体饮料行业商业模式创新与投