服务器之家

服务器之家 > 正文

oracle 层次化查询(行政区划三级级联)

时间:2019-11-05 15:20     来源/作者:oracle教程网

前提: 
数据库表DM_xzqh样例(部分): 

复制代码代码如下:


DM MC 
230000 黑龙江省 
230100 哈尔滨市 
230101 市辖区 
230102 道里区 
232700 大兴安岭 
230103 南岗区 
230104 道外区 
230108 平房区 
230109 松北区 
230110 香坊区 
230111 呼兰区 
230112 阿城区 
230123 依兰县 
238000 农垦分局 
230124 方正县 
230125 宾县 
230126 巴彦县 
230127 木兰县 
230128 通河县 
230129 延寿县 
230182 双城市 
230183 尚志市 


现在将上面的行政区划按代码分为三个级别:省(后四位为0)/市(后两位为0)/县,同时分别标出他们的级别,这样的话,便于后期根据不同的级别查询。

首先,根据上面表拓展出新的一行sjbm,该行用于表示该行政区划所属的上级行政区划。具体代码如下: 

复制代码代码如下:


select t.dm,t.mc,case 
when substr(t.dm,3)='0000' then 1 
when substr(t.dm,5)='00' then to_number(substr(t.dm,1,2)||'0000') 
when substr(t.dm,5)!='00' then to_number(substr(t.dm,1,4)||'00') 
else 0 
end sjbm from dm_xzqh t 


结果如下: 
序号 DM MC SJBM 
1 230000 黑龙江省 1 
2 230100 哈尔滨市 230000 
3 230101 市辖区 230100 
4 230102 道里区 230100 
5 232700 大兴安岭 230000 
6 230103 南岗区 230100 
7 230104 道外区 230100 
8 230108 平房区 230100 
9 230109 松北区 230100 
10 230110 香坊区 230100 
11 230111 呼兰区 230100 
12 230112 阿城区 230100 
13 230123 依兰县 230100 
14 238000 农垦分局 230000 
15 230124 方正县 230100 
16 230125 宾县 230100 
17 230126 巴彦县 230100 
18 230127 木兰县 230100 
19 230128 通河县 230100 
20 230129 延寿县 230100 
21 230182 双城市 230100 
22 230183 尚志市 230100 
然后,就可以利用oracle的层次关系将该查询出的数据分级了,具体代码如下: 

复制代码代码如下:


select level,dm,mc,sjbm from 
(select t.dm,t.mc,case 
when substr(t.dm,3)='0000' then 1 
when substr(t.dm,5)='00' then to_number(substr(t.dm,1,2)||'0000') 
when substr(t.dm,5)!='00' then to_number(substr(t.dm,1,4)||'00') end sjbm from dm_xzqh t) 
[where level=2 ]--该条件语句用于查询具体的每一个级别的行政区划 
start with sjbm=1 
connect by prior dm=sjbm 
[order by level]; 


结果如下: 
序号 level DM MC SJBM 
1 1 230000 黑龙江省 1 //省 ,level->1 
2 2 230100 哈尔滨市 230000//市,level->2 
3 3 230101 市辖区 230100//县,level->3 
4 3 230102 道里区 230100 
5 3 230103 南岗区 230100 
6 3 230104 道外区 230100 
7 3 230108 平房区 230100 
8 3 230109 松北区 230100 
9 3 230110 香坊区 230100 
10 3 230111 呼兰区 230100 
11 3 230112 阿城区 230100 
12 3 230123 依兰县 230100 
13 3 230124 方正县 230100 
14 3 230125 宾县 230100 
15 3 230126 巴彦县 230100 
16 3 230127 木兰县 230100 
17 3 230128 通河县 230100 
18 3 230129 延寿县 230100 
19 3 230182 双城市 230100 
20 3 230183 尚志市 230100 
21 3 230184 五常市 230100 
22 2 232700 大兴安岭地区 230000

相关文章

热门资讯

玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
Nginx服务器究竟是怎么执行PHP项目
Nginx服务器究竟是怎么执行PHP项目 2019-05-24
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
返回顶部