start with connect by prior的使用方法
轉(zhuǎn)載文章地址: https://www.cnblogs.com/benbenduo/p/4588612.html
測(cè)試數(shù)據(jù)
創(chuàng)建表
create table TEST_TABLE (parentid VARCHAR2(10),subid VARCHAR2(10) );插入測(cè)試數(shù)據(jù)
insert into test_table (PARENTID, SUBID) values ('1', '2'); insert into test_table (PARENTID, SUBID) values ('1', '3'); insert into test_table (PARENTID, SUBID) values ('2', '4'); insert into test_table (PARENTID, SUBID) values ('2', '5'); insert into test_table (PARENTID, SUBID) values ('3', '6'); insert into test_table (PARENTID, SUBID) values ('3', '7'); insert into test_table (PARENTID, SUBID) values ('5', '8'); insert into test_table (PARENTID, SUBID) values ('5', '9'); insert into test_table (PARENTID, SUBID) values ('7', '10'); insert into test_table (PARENTID, SUBID) values ('7', '11'); insert into test_table (PARENTID, SUBID) values ('10', '12'); insert into test_table (PARENTID, SUBID) values ('10', '13');數(shù)據(jù)結(jié)構(gòu)
使用場(chǎng)景
主要是用于B樹(shù)等類型結(jié)構(gòu)的遞歸查詢,我們可以通過(guò)樹(shù)中的任意一個(gè)節(jié)點(diǎn)來(lái)遍歷該樹(shù)。
語(yǔ)法格式
select … from tablenamestart with 條件1connect by *** prior ***where 條件3;語(yǔ)法說(shuō)明
-
start with: 遍歷的開(kāi)始節(jié)點(diǎn),可以是父節(jié)點(diǎn)也可以是子節(jié)點(diǎn)
-
父節(jié)點(diǎn)
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.parentid = '3' CONNECT BY PARENTID = PRIOR SUBIDORDER BY LEVEL DESC結(jié)果:
上面start with后面接的是父節(jié)點(diǎn)為3,遍歷的結(jié)果就是以3位父節(jié)點(diǎn)的所有數(shù)據(jù),如果父節(jié)點(diǎn)是最后的葉子節(jié)點(diǎn)(比如13),那么查詢結(jié)果就是空。 -
子節(jié)點(diǎn)
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7' CONNECT BY PARENTID = PRIOR SUBIDORDER BY LEVEL DESC結(jié)果
可以看到子節(jié)點(diǎn)subid是從7開(kāi)始的。
-
-
connect by prior : 連接條件。關(guān)鍵詞prior,prior跟父節(jié)點(diǎn)列放在一起,就是往父結(jié)點(diǎn)方向遍歷,prior跟子結(jié)點(diǎn)列放在一起,則往葉子結(jié)點(diǎn)方向遍歷,父節(jié)點(diǎn)與子節(jié)點(diǎn)誰(shuí)放在“=”前都無(wú)所謂,關(guān)鍵是prior跟誰(shuí)在一起。
-
可以看到在上面的案例中start with后面無(wú)論是接的subid還是parentid都是向樹(shù)的下方(子節(jié)點(diǎn))去遍歷。這個(gè)就是與prior是與誰(shuí)連接在一起有關(guān)了。上面的兩個(gè)例子中與prior連接在一起的都是subid,因此都是向子節(jié)點(diǎn)去遍歷。
-
prior與parentid相連
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7' CONNECT BY subid = PRIOR parentidORDER BY LEVEL DESC結(jié)果
可以看到此時(shí)是向父節(jié)點(diǎn)去遍歷的。因?yàn)閜rior后面是緊跟的parentid。
-
使用level
在具有樹(shù)結(jié)構(gòu)的表中,每一行數(shù)據(jù)都是樹(shù)結(jié)構(gòu)中的一個(gè)節(jié)點(diǎn),由于節(jié)點(diǎn)所處的層次位置不同,所以每行記錄都可以有一個(gè)層號(hào)。層號(hào)根據(jù)節(jié)點(diǎn)與根節(jié)點(diǎn)的距離確定。不論從哪個(gè)節(jié)點(diǎn)開(kāi)始,該起始根節(jié)點(diǎn)的層號(hào)始終為1,根節(jié)點(diǎn)的子節(jié)點(diǎn)為2。需要注意的是這里所說(shuō)的根節(jié)點(diǎn)指的是start with后面的那個(gè)節(jié)點(diǎn)
parentid為第一層級(jí)
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.parentid = '7' CONNECT BY parentid = PRIOR subidORDER BY LEVEL DESC; SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.parentid = '7' CONNECT BY subid = PRIOR parentidORDER BY LEVEL DESC;
可以看到無(wú)論prior后面接的是parentid還是subid,第一層級(jí)都是parentid為7(start with后面的值)。
subid為第一層級(jí)
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7' CONNECT BY parentid = PRIOR subidORDER BY LEVEL DESC; SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7' CONNECT BY subid = PRIOR parentidORDER BY LEVEL DESC;此時(shí)可以看到無(wú)論prior后面接的是parentid還是subid,當(dāng)start with后面接的是subid為7時(shí),那么第一層級(jí)都是subid為7。
總結(jié)
以上是生活随笔為你收集整理的start with connect by prior的使用方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 配置fedora 33
- 下一篇: c语言参考书