水柔儿

正式会员

静水深流

贴子 763

精华 0

积分 399

信用 0

竞猜 0

魅力 35

威望 0

现金 50 CZB

银行 0 CZB

黄金 0

比特币 0

注册时间 2006-08-02

发表于:2007-10-16 14:10:13   |  显示全部帖子   |  本帖随机奖励楼主:0 CZB   |  转账至  水柔儿
引用:
原帖由 IceCool 于 2007-10-16 10:32 发表
test表里 有 id  team 两个字段

id   team
1      A  
2      A
3      B
4      B
5      C
6      C


在update 的时候 我想做以下操作 根据team 来更改ID  从team 'B'的最小id 开始 把3改成-1 4改成 ...
不是太明白 C怎么处理?
我想你,已经到泛滥的极限
即使在你身边,我依然想着你
楼主
编辑   |    引用    回帖
关闭    高亮    置顶   |    移动    回收站   |    -6删主题    删主题    |   
水柔儿

正式会员

静水深流

贴子 763

精华 0

积分 399

信用 0

竞猜 0

魅力 35

威望 0

现金 50 CZB

银行 0 CZB

黄金 0

比特币 0

注册时间 2006-08-02

发表于:2007-10-16 15:10:13   |  显示全部帖子   |  转账至  水柔儿
如果只是更新B 可以这么写:

update test m
set m.id =
(
select sortnum
from (select -rownum  sortnum ,id,name from test where name = 'B') n
where m.id = n.id
)
where m.name = 'B'


------------------------------------------------------------------
如果所有的Name都要更新,存储过程

create or replace procedure prc_ipdate_test
is
cursor cur_temp is
  select distinct test.name from  test;
begin
  FOR cur_1 in cur_temp LOOP
        update test m
           set m.id =
                    (
                        select sortnum
                        from (select -rownum  sortnum ,id,name from test where name = cur_1.name) n
                        where m.id = n.id
                        and m.name = n.name
                    )
         where m.name = cur_1.name;
  end loop;
commit;  
end prc_ipdate_test;

[ 本帖最后由 水柔儿 于 2007-10-16 15:39 编辑 ]
我想你,已经到泛滥的极限
即使在你身边,我依然想着你
沙发
编辑   |    引用    回帖
关闭    高亮    置顶   |    移动    回收站   |    -6删帖    删帖    |   
水柔儿

正式会员

静水深流

贴子 763

精华 0

积分 399

信用 0

竞猜 0

魅力 35

威望 0

现金 50 CZB

银行 0 CZB

黄金 0

比特币 0

注册时间 2006-08-02

发表于:2007-10-16 22:10:30   |  显示全部帖子   |  转账至  水柔儿
引用:
原帖由 金狐 于 2007-10-16 20:01 发表
上面的程序不太适合大量的数据操作。应该分开两步来,第一步找出B的最小的id,也就是要找出要减去的步长,第二部再update。SQL复合语句多并不是好事
呵呵 本来存储过程都打算省略了。。。。
我想你,已经到泛滥的极限
即使在你身边,我依然想着你
板凳
编辑   |    引用    回帖
关闭    高亮    置顶   |    移动    回收站   |    -6删帖    删帖    |