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

(0)

相关推荐

  • Oracle数据库中的级联查询、级联删除、级联更新操作教程

    级联查询 在ORACLE 数据库中有一种方法可以实现级联查询 select * //要查询的字段 from table //具有子接点ID与父接点ID的表 start with selfid=id //给定一个startid(字段名为子接点ID,及开始的ID号) connect by prior selfid=parentid //联接条件为子接点等于父接点,不能反 这个SQL主要用于菜单的级联查询,给一个父接点可以查出所有的子接点.及子接点的子接点,一查到底,很实用.不过呢这个程序只能在ora

  • Oracle多表级联更新详解

    用游标实现,我觉得绝对这种方法比较安全的.--首先定一个游标把需要用到的一些数据存放到游标中: 复制代码 代码如下: declare   CURSOR D_CURSOR_CUS_INFO IS    select t3.id_           as id_,           t3.owe_money_    as owe_money_,           a.heatingArea    as heating_area_    from T_CUS_OWE_MONEY_2 t2   

  • 解析Oracle中多表级联删除的方法

    表间的关系比较复杂,数据量又比较多,一个个删绝对会出大问题.于是实验了几种解决的办法,现小结一下. 方法一:创建约束时设定级联删除(但一般由于各种原因或出于各种考虑在创建数据库时没有设定级联删除)SQL语句: 复制代码 代码如下: CREATE TABLE "U_WEN_BOOK"."FARTAB" ("FAR_ID" NUMBER(10) NOT NULL,"FAR_NAME" VARCHAR2(10), "OTH

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

    前提: 数据库表DM_xzqh样例(部分): 复制代码 代码如下: DM MC 230000 黑龙江省 230100 哈尔滨市 230101 市辖区 230102 道里区 232700 大兴安岭 230103 南岗区 230104 道外区 230108 平房区 230109 松北区 230110 香坊区 230111 呼兰区 230112 阿城区 230123 依兰县 238000 农垦分局 230124 方正县 230125 宾县 230126 巴彦县 230127 木兰县 230128 通河

  • Ajax实现省市区三级级联(数据来自mysql数据库)

    实现Ajax实现省市区三级级联,需要Java解析json技术 整体Demo下载地址如下: 点我下载 address.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <script type="text/javascript">

  • 一文解析ORACLE树结构查询

    我们在日常程序设计中,经常会遇到树状结构的表示,例如组织机构.行政区划等等.这些在数据库中往往通过一张表进行展示.这里我们以一张简单的行政区划表为例进行展示,在实际使用过程中,可以为其添加其他描述字段以及层级. 表中通过ID和PID关联,实现树状结构的存储.建表以及数据语句如下: -- Create table create table TREETEST ( id NVARCHAR2(50), pid NVARCHAR2(50), name NVARCHAR2(50) ) insert into

  • JavaScript实现三级级联特效

    本文实例为大家分享了js实现三级级联特效的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <!-- 实现效果:选择省会出现相应的县下拉框,同时市的下拉框改变--> <script type="applicati

  • Oracle分页查询的实例详解

    Oracle分页查询的实例详解 1.Oracle分页查询: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM tab) A WHERE ROWNUM <= 40 ) WHERE RN >= 21; 这个分页比下面的执行时间少,效率高. 2. select * from (select c.*,rownum rn from tab c) where rn between 21 and 40 对比这两种写法,绝大多数的情况下,第一个

  • Oracle分页查询性能优化代码详解

    对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如此之多,就不得不对数据进行分页处理.常常用户并不是对所有数据都感兴趣的,或者大部分情况下,他们只看前几页. 通常有以下两种分页技术可供选择. Select * from ( Select rownum rn,t.* from table t) Where rn>&minnum and rn<=&maxnum 或者 Select * from ( Select rownum rn,t.* fro

  • mysql、mssql及oracle分页查询方法详解

    本文实例讲述了mysql.mssql及oracle分页查询方法.分享给大家供大家参考.具体分析如下: 分页查询在web开发中是最常见的一种技术,最近在通过查资料,有一点自己的心得 一.mysql中的分页查询 注: m=(pageNum-1)*pageSize;n= pageSize; pageNum是要查询的页码,pageSize是每次查询的数据量, 方法一: select * from table order by id limit m, n; 该语句的意思为,查询m+n条记录,去掉前m条,返

  • Oracle批量查询、删除、更新使用BULK COLLECT提高效率

    BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记. 例1: 批量查询项目资金账户号为 "320001054663"的房屋账户信息并把它们打印出来 . DECLARE TYPE acct_table_type IS TABLE OF my_acct%ROWTYPE INDEX BY BINARY_INTEGER; v_acct_table acct_table_type; BE

  • php实现三级级联下拉框

    这是我在网上查找到的php实现三级级联下拉框的资料,共享个大家,大家一起进步,具体内容如下 index.php: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>Ajax联动菜单</title> <script language="javascript"

  • JavaScript实现省市县三级级联特效

    本文实例为大家分享了js省市县三级级联特效的实现代码,供大家参考,具体内容如下 主要思想 1.省改变,市改变,并初始化县 2.市改变,县改变 html代码 <select id="sheng"> <option value="">--请选择--</option> <option value="0">北京市</option> <option value="1"&g

随机推荐