ORACLE,绝对有技术含量的问题。高手请进

jancky2001 2009-06-11 05:26:12
问题描述:
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表中生成数据。
呵呵。。。估计有些难度,不过我相信有高手在,如果问题解决了,我立即给分。



...全文
46 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
白发程序猿 2009-06-12
楼上的是可以的
我只写出来一个没有编号的

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
回复
hebo2005 2009-06-12
这个其实要把列转成行,假设原表中三个字段都不会出现空值,可以这样
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
回复
hebo2005 2009-06-12
[Quote=引用 6 楼 ling242a 的回复:]
楼上都没理解楼主的意思
楼主是想把表tareaname的数据
...
11 渭南 澄城 澄城特殊片区
12 渭南 白水 白水中心片区
13 渭南 潼关 潼关县城片区
14 渭南 潼关 潼关中心片区
...
变成表tarea那样的数据
...
001 渭南 0 0
001001 澄城 1 001
001002 白水 1 001
001003 潼关 1 001
001001001 澄城特殊片区 2 001001
0…
[/Quote]
根据这个数据生成树型表
用row_number这个分析函数来形成每级的编号,然后再来拼出来
回复
白发程序猿 2009-06-12
楼上都没理解楼主的意思
楼主是想把表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
...
回复
jdsnhan 2009-06-11
典型的 start with connect by 树形展现问题
回复
william3033 2009-06-11
[Quote=引用 1 楼 hebo2005 的回复:]
你的示例数据不全

area_id area_name area_level_di parent_area_id
001 渭南 0 0
这个按正常的设计应该是这样的
area_id area_name area_level_di parent_area_id
001 渭南 0 0
001001 渭水 1 001
001002 白水 1 001

这样的设计,用语句很简单的,

SQL co…
[/Quote]
精辟,顶你。
回复
suncrafted 2009-06-11
帮顶下
回复
inthirties 2009-06-11
[Quote=引用 1 楼 hebo2005 的回复:]
你的示例数据不全

area_id  area_name    area_level_di        parent_area_id
001 渭南    0                0
这个按正常的设计应该是这样的
area_id  area_name    area_level_di        parent_area_id
001      渭南                0                0
001001  渭水                1                001
001002  白水                1                001

这样的设计,用语句很简单的,
SQL code
select *
f…
[/Quote]

厉害
回复
hebo2005 2009-06-11
你的示例数据不全

area_id area_name area_level_di parent_area_id
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


这里只是简单写了下语法
具体的语句,你可以参考这个改一下
回复
发帖
Oracle 高级技术
创建于2007-09-28

3406

社区成员

Oracle 高级技术相关讨论专区
申请成为版主
帖子事件
创建了帖子
2009-06-11 05:26
社区公告
暂无公告