现在我数据库表中有1万条数据,有一个字段是flag 
我现在想把前2000条的flag更改成1 
第2001条到7000条flag改成2 
第7001条到9000条改成3 
剩下的改成4 怎么实现?前提是这个表中没有自动编号的字段在上篇帖子中,有朋友这样回答
alter table tb add px int identity(1,1)
go
update tb set flag=1 where px<=2000
update tb set flag=2 where px between 2001 and 7000
---依次类推
--最后,
alter table tb drop column px
go但是不能实现我的那个,因为在我的表中有很多数据,我只需要改flag=0的,而在此之前已经有很多是等于其他数值的记录了,如果我添加一行ID列那所有的数据都会有id,也许我要修改的数据并不是连贯的,而且id并不会小于1万,这样的更新就不行了。
有没有其他方法能实现我说的这个?
1万条数据的得到方法是
select top 10000 * from datas where flag=0

解决方案 »

  1.   

    -->如果是的话:
    -->1.增加辅助列
    alter table tb add id int identity(1,1)
    -->2.开始更新
    update tb 
    set flag=case when id <=2000 then 1
                  when id between 2001 and 7000 then 2
                  when id between 7001 and 9000 then 3
                  else 4
             end
    where flag=0
    -->3.删除辅助列
    alter table tb drop column id
      

  2.   


    declare @ids int
    declare cur cursor
    for
    select top 2000 px from tb where flag = 0 order by px
    --第二次
    --select top 5000 from ( select top 7000 px from tb where flag = 0 order by px) b order by px descopen cur
    fetch next from cur into @ids
    while @@FETCH_STATUS = 0
    begin update tb set flag = 1 where px = ids

    fetch next from cur into @idsendclose cur
    deallocate cur
      

  3.   

    楼主的前2000条记录应该是指“前2000条flag=0”的
      

  4.   

    -->如果只想更新到10000条的话则:
    -->1.增加辅助列
    alter table tb add id int identity(1,1)
    -->2.开始更新
    update tb 
    set flag=case when id <=2000 then 1
                  when id between 2001 and 7000 then 2
                  when id between 7001 and 9000 then 3
                  else 4
             end
    where flag=0 
      and id<=10000
    -->3.删除辅助列
    alter table tb drop column id
      

  5.   

    不用再看一楼,如果想满足以下条件:我现在想把前2000条的flag更改成1 
    第2001条到7000条flag改成2 
    第7001条到9000条改成3 
    剩下的改成4 
    且保存原有flag不等于0的不动3 7楼是可以的。
      

  6.   

    不用再看一楼,如果想满足以下条件:我现在想把前2000条的flag更改成1 
    第2001条到7000条flag改成2 
    第7001条到9000条改成3 
    剩下的改成4 
    且保持原有flag不等于0的不动3 7楼是可以的。
      

  7.   

    9楼,你的方法不行,我看过了,我不是想跟新前1万条,而是更新前1万条flag!=0的数据
    如果添加一个自定义编号,那么从id=1一直到id=10000,所有的flag都不等于0你那个就失效了
    而且我的flag=0的数据并不是连贯的
    明白我的意思吗?
      

  8.   

    现在才明白,用以下语句:
    -->1.增加辅助列
    alter table tb add id int identity(1,1)
    -->2.开始更新
    update a 
    set a.flag=case when a.id <=2000 then 1
                  when a.id between 2001 and 7000 then 2
                  when a.id between 7001 and 9000 then 3
                  else 4
             end
    from tb a
    where a.flag=0 
      and (select count(1) from tb where flag=a.flag and id<=a.id)<=10000
    -->3.删除辅助列
    alter table tb drop column id
      

  9.   

    我干脆把我整个需求写出来吧现在我这里有一个客户表Client,里面不停的要添加数据,新加进去的数据user_id都是=0的
    还有一个用户表users,在我程序中有个分配客户的页面,首先输入要分配客户的数量,然后选择分配给哪个用户,每个用户都有个分配数量
    如:
    预分配客户数量:100
    分配用户:用户名 用户ID 个数
    Mars.CN 1 20
    Suolong123 2 35
    Admin 3 25
    LastUser 4 20用户的数量不定,有时候多有时候少,客户的数量也是手输的这样,我需要一个分配客户的sql语句,要把client表的user_id改成用户ID
    这个怎么实现?
    我想写成一个存储过程
      

  10.   

    DECLARE @i INT;
    SET @i=0;UPDATE tb SET
        flag = CASE WHEN @i<=2000 THEN 1
                    WHEN @i BETWEEN 2001 AND 7000 THEN 2
                    WHEN @i BETWEEN 70001 AND 9000 THEN 3
                    ELSE 4 END,
        @i=@i+1;
      

  11.   

    应该要改为这样吧:DECLARE @i INT;
    SET @i=0;UPDATE tb SET
        flag = CASE WHEN @i<=2000 THEN 1
                    WHEN @i BETWEEN 2001 AND 7000 THEN 2
                    WHEN @i BETWEEN 70001 AND 9000 THEN 3
                    ELSE 4 END,
        @i=@i+1
    WHERE flag=0 
      AND @i<=10000;
      

  12.   

    UPDATE TOP(10000) tb SET
        flag = CASE WHEN @i<=2000 THEN 1
                    WHEN @i BETWEEN 2001 AND 7000 THEN 2
                    WHEN @i BETWEEN 70001 AND 9000 THEN 3
                    ELSE 4 END,
        @i=@i+1
    WHERE flag=0;
      

  13.   

    果然错了。if object_id('tb') is not null
      drop table tb
    go
    create table tb(flag int)
    insert tb select top 100 0 from sysobjects
    go
    DECLARE @i INT;
    SET @i=0;UPDATE top(90) tb SET
        flag = CASE WHEN @i<=2000 THEN 1
                    WHEN @i BETWEEN 2001 AND 7000 THEN 2
                    WHEN @i BETWEEN 70001 AND 9000 THEN 3
                    ELSE 4 END,
        @i=@i+1
    WHERE flag=0 
    go
    select * from tb
    /*
    flag
    -----------
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0(100 行受影响)
    */
      

  14.   

    这个新花样今天才学到,多谢小LIANG.偶那个也是对的。if object_id('tb') is not null
      drop table tb
    go
    create table tb(flag int)
    insert tb select top 120 0 from sysobjects,syscolumns
    go
    -->1.增加辅助列
    alter table tb add id int identity(1,1)
    -->创建虚拟环境
    update tb set flag=9 where id between 55 and 65
    -->2.开始更新
    update a 
    set a.flag=case when a.id <=20 then 1
                  when a.id between 21 and 70 then 2
                  when a.id between 71 and 90 then 3
                  else 4
             end
    from tb a
    where a.flag=0 
      and (select count(1) from tb where flag=a.flag and id<=a.id)<=100
    -->3.删除辅助列
    alter table tb drop column id
    go
    -->4.查询结果
    select * from tb
    /*
    flag
    -----------
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    9
    9
    9
    9
    9
    9
    9
    9
    9
    9
    9
    2
    2
    2
    2
    2
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    3
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    4
    0
    0
    0
    0
    0
    0
    0
    0
    0(120 行受影响)*/