id  起始编号  结束编号  数量  父id  所属单位
1    00001    01000    1000   0    省级一
2    01001    10000    8999   0    省级二
3    00001    00500    500    1    市级一
4    00501    00600    100    1    市级二
5    00601    00900    300    1    市级三
6    00901    01000    100    1    市级四
7    00601    00750    150    5    县级一
8    00751    00900    150    5    县级二需求是:
管理员想要将某一号段从已分配好的号码段中收回,再分给其他单位,
如要从id为1的号码段中收回一部分号码(00701-00800)分到省级三,那么其下级各号段只要有此号段中的号码,
就要断开分段,并更新id及数量,那么可能从中间分开|两头分开,或者被包含而完全被收回重分配到另一单位.
如下,结果应该为:
id 起始编号 结束编号  数量  父id  所属单位
1   00001   00700    700     0   省级一
2   01001   10000    8999    0   省级二
3   00001   00500    500     1   市级一
4   00501   00600    100     1   市级二
5   00601   00700    100     1   市级三
6   00901   01000    100     1   市级四
7   00601   00700    100     5   县级一
8   00801   00900    100     5   县级二
9   00801   01000    200     0   省级一
10  00801   00900    100     1   市级三
11  00701   00800    100     0   省级三求一oracle Sql高效递归算法代码.
注:此模式数据量大,层次深且不固定

解决方案 »

  1.   

    一个问题,如果ID:150之前是个A单位用的。现在更换给了B单位。那么这个ID下绑定的单位的一切相关数据如何处理?
    是全部随ID150迁移到B下面吗?若不迁移,岂不是引起了歧义?
      

  2.   

    是的.若要收回的编号段包含A单位的号段,则全部迁到新的B单位,A单位则消失了,其下的隶属关系当然也得没了.那么其下的数据也得跟着变化---"消失"(在此例"全收回")了.呵呵!
      

  3.   

    begin transactioninsert into yourTable
    select id,00801,endNo,数量,父id,所属单位 from yourTable
    where startNo<00701 and endNo>00800update yourTable
    set endNo=00700
    where startNo<00701 and endNo>=00701update yourTable
    set startNo=00801
    where startNo<=00800 and endNo>00800 and startNo>=00701delete from yourTable
    where startNo>=00701 and endNo<=00800commit transaction
      

  4.   

    你的表如果id是主键,可能还需要修改。
    另外还需要加入插入新数据的insert语句。
    我手头没环境,你自己试试先。
      

  5.   

    就这个问题再问你一个问题:若是省级前面还有父级,而当前操作管理员属于省级,他应该只能管理其级别下的数据,比如像下面这样:
    id  起始编号  结束编号  数量  父id  所属单位
    0    00001    10000    10000  null 高级一
    1    00001    01000    1000   0    省级一
    2    01001    10000    9000   0    省级二
    3    00001    00500    500    1    市级一
    4    00501    00600    100    1    市级二
    5    00601    00900    300    1    市级三
    6    00901    01000    100    1    市级四
    7    00601    00750    150    5    县级一
    8    00751    00900    150    5    县级二 照你的解决方法,"高级"中的数据将也会被"误处理"了,怎么才能解决这个问题呢?