问题描述:
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.   

    你的示例数据不全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 这里只是简单写了下语法
    具体的语句,你可以参考这个改一下
      

  2.   

    典型的 start with  connect by  树形展现问题
      

  3.   

    楼上都没理解楼主的意思
    楼主是想把表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
    ...
      

  4.   

    根据这个数据生成树型表
    用row_number这个分析函数来形成每级的编号,然后再来拼出来
      

  5.   

    这个其实要把列转成行,假设原表中三个字段都不会出现空值,可以这样
    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
      

  6.   

    楼上的是可以的
    我只写出来一个没有编号的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