问题描述:
1:用oracle语句执行对应功能
2:有两张表,一张tareaname表,数据格式是:
city area town
1 渭南 澄城 澄城特殊片区
2 渭南 澄城 澄城特殊片区
3 渭南 澄城 澄城特殊片区
4 渭南 澄城 澄城特殊片区
5 渭南 澄城 澄城罗家洼片区
6 渭南 澄城 澄城特殊片区
7 渭南 澄城 澄城特殊片区
8 渭南 澄城 澄城特殊片区
9 渭南 澄城 澄城特殊片区
10 渭南 澄城 澄城特殊片区
11 渭南 澄城 澄城特殊片区
12 渭南 白水 白水中心片区
13 渭南 潼关 潼关县城片区
14 渭南 潼关 潼关中心片区描述:此表为基础数据表,area字段有多个area值,每个area值对应多个town值3:表tarea格式:
area_id area_name area_level_di parent_area_id
001 渭南 0 0用一段oracle语句,从技术数据表tareaname表中,按照对应的格式,自动生成数据,规则
1:每一层次用三位数表示,比如渭南是第一级,那么area_id就是001,渭南下面的白水,用001001表示,渭南下面的潼关用001002表示,白水下面的白水中心片区用001001001表示,白水其他的一个片区用001001002表示
2:area_level_id分为三级,渭南为0级,白水为1级,白水下面的片区为2级
3:对于parent_area_id,就是该地区的上级的id,比如白水的parent_area_id肯定就是001,一次类推。要求,用一段sql语句在tarea表中生成数据。
呵呵估计有些难度,不过我相信有高手在,如果问题解决了,我立即给分。
1:用oracle语句执行对应功能
2:有两张表,一张tareaname表,数据格式是:
city area town
1 渭南 澄城 澄城特殊片区
2 渭南 澄城 澄城特殊片区
3 渭南 澄城 澄城特殊片区
4 渭南 澄城 澄城特殊片区
5 渭南 澄城 澄城罗家洼片区
6 渭南 澄城 澄城特殊片区
7 渭南 澄城 澄城特殊片区
8 渭南 澄城 澄城特殊片区
9 渭南 澄城 澄城特殊片区
10 渭南 澄城 澄城特殊片区
11 渭南 澄城 澄城特殊片区
12 渭南 白水 白水中心片区
13 渭南 潼关 潼关县城片区
14 渭南 潼关 潼关中心片区描述:此表为基础数据表,area字段有多个area值,每个area值对应多个town值3:表tarea格式:
area_id area_name area_level_di parent_area_id
001 渭南 0 0用一段oracle语句,从技术数据表tareaname表中,按照对应的格式,自动生成数据,规则
1:每一层次用三位数表示,比如渭南是第一级,那么area_id就是001,渭南下面的白水,用001001表示,渭南下面的潼关用001002表示,白水下面的白水中心片区用001001001表示,白水其他的一个片区用001001002表示
2:area_level_id分为三级,渭南为0级,白水为1级,白水下面的片区为2级
3:对于parent_area_id,就是该地区的上级的id,比如白水的parent_area_id肯定就是001,一次类推。要求,用一段sql语句在tarea表中生成数据。
呵呵估计有些难度,不过我相信有高手在,如果问题解决了,我立即给分。
解决方案 »
- 我下载了ODAC 11.2 Release 5,想使用Oracle Provider for OLE DB 进行数据库的连接等操作,但是不知引用那个dll文件
- 刚从SQL2005来到ORACLE,先探探深浅
- Oracle存储过程游标问题,数据库表明明有数据,但游标返回的集合为0
- Oracle的SQL Plus worksheet与VB中ADO.Recordset执行同一查询语句结果不同...
- 你们快点帮帮我啦
- 数据库连接问题
- 我是新手想学习ORACLE,各位请指教!
- 怎么新建个数据库呀?用DBA Studio?
- 游标使用的问题
- 关于千万数据量的oracle数据库优化效果的问题
- 批量UPDATE两个表中的数据.
- [急求]Windows 2003 server + oracle 10g 双机热备蓝屏问题
001 渭南 0 0
这个按正常的设计应该是这样的
area_id area_name area_level_di parent_area_id
001 渭南 0 0
001001 渭水 1 001
001002 白水 1 001这样的设计,用语句很简单的,
select *
from area
start with parent_area_id='0'
connect by piror area_id=parent_area_id 这里只是简单写了下语法
具体的语句,你可以参考这个改一下
楼主是想把表tareaname的数据
...
11 渭南 澄城 澄城特殊片区
12 渭南 白水 白水中心片区
13 渭南 潼关 潼关县城片区
14 渭南 潼关 潼关中心片区
...
变成表tarea那样的数据
...
001 渭南 0 0
001001 澄城 1 001
001002 白水 1 001
001003 潼关 1 001
001001001 澄城特殊片区 2 001001
001002001 白水中心片区 2 001002
001003001 潼关县城片区 2 001003
001003002 潼关中心片区 2 001003
...
用row_number这个分析函数来形成每级的编号,然后再来拼出来
SELECT DISTINCT LPAD (DENSE_RANK () OVER (ORDER BY city), 3, '0') area_id,
city area_name, 0 area_level_di, 0 parent_area_id
FROM tareaname
UNION ALL
SELECT DISTINCT LPAD (DENSE_RANK () OVER (ORDER BY city), 3, '0')
|| LPAD (DENSE_RANK () OVER (PARTITION BY city ORDER BY city,
area),
3,
'0'
) area_id,
area area_name, 1 area_level_di,
LPAD (DENSE_RANK () OVER (ORDER BY city),
3,
'0'
) parent_area_id
FROM tareaname
UNION ALL
SELECT DISTINCT LPAD (DENSE_RANK () OVER (ORDER BY city), 3, '0')
|| LPAD (DENSE_RANK () OVER (PARTITION BY city ORDER BY city,
area),
3,
'0'
)
|| LPAD (DENSE_RANK () OVER (PARTITION BY city, area ORDER BY city,
area, town),
3,
'0'
) area_id,
town area_name, 2 area_level_di,
LPAD (DENSE_RANK () OVER (ORDER BY city),
3,
'0'
)
|| LPAD (DENSE_RANK () OVER (PARTITION BY city ORDER BY city,
area),
3,
'0'
) parent_area_id
FROM tareaname
我只写出来一个没有编号的select dense_rank() over(partition by parent_area order by area_name) area_id,
c.*
from (select distinct decode(b.num, 0, city, 1, area, 2, town) area_name,
b.num area_level_id,
decode(b.num, 0, '0', 1, city, 2, area) parent_area
from tareaname a,
(select 0 num
from dual
union all
select 1 num
from dual
union all
select 2 num from dual) b) c
order by area_level_id, area_id