none
TSQL 去掉重复的行(我是菜鸟) RRS feed

  • 问题

  • 例: A表 表结构如下:  intType,  name   int3 

    intType    name                   int3

    0 张三                    0

    99            张三                     0

    0             李四                      0

    99          李四                       0

    99           王五                      0

    99           赵六                     0

    0            赵六                      0

    99         X                             0

    0           Y                                0


    根据  intTYPE 是 0   根据  name字段  重复的名字  ,name 把int3  状态变成1  例如:

    intType    name                   int3

    0 张三                   1

    99            张三                     0

    0             李四                     1

    99          李四                       0

    99           王五                      0

    99           赵六                     0

    0            赵六                    1

    99         X                             0

    0           Y                                0



    2012年6月28日 2:57

答案

  • declare @A表 table
    ([intType] int,[name] varchar(4),[int3] int)
    insert @A表
    select 0,'张三',0 union all
    select 99,'张三',0 union all
    select 0,'李四',0 union all
    select 99,'李四',0 union all
    select 99,'王五',0 union all
    select 99,'赵六',0 union all
    select 0,'赵六',0 union all
    select 99,'X',0 union all
    select 0,'Y',0
    
    --更新前
    select * from @A表
    /*
    intType     name int3
    ----------- ---- -----------
    0           张三   0
    99          张三   0
    0           李四   0
    99          李四   0
    99          王五   0
    99          赵六   0
    0           赵六   0
    99          X    0
    0           Y    0
    */
    
    --更新
    update @A表 set int3=1 from @A表 a 
    left join 
    (
    	select name from @A表 
    	group by name having(count(1)>1)
    ) b on a.name=b.name 
    where b.name is not null and intType=0
    
    --更新后
    select * from @A表
    /*
    intType     name int3
    ----------- ---- -----------
    0           张三   1
    99          张三   0
    0           李四   1
    99          李四   0
    99          王五   0
    99          赵六   0
    0           赵六   1
    99          X    0
    0           Y    0
    */


    2012年6月28日 6:09
    版主

全部回复

  • 怎么没人理我啊    。。。。。
    2012年6月28日 3:23
  • 你自己说得不清不楚的。

    想不想时已是想,不如不想都不想。

    2012年6月28日 3:57
    版主
  • declare @A表 table
    ([intType] int,[name] varchar(4),[int3] int)
    insert @A表
    select 0,'张三',0 union all
    select 99,'张三',0 union all
    select 0,'李四',0 union all
    select 99,'李四',0 union all
    select 99,'王五',0 union all
    select 99,'赵六',0 union all
    select 0,'赵六',0 union all
    select 99,'X',0 union all
    select 0,'Y',0
    
    --更新前
    select * from @A表
    /*
    intType     name int3
    ----------- ---- -----------
    0           张三   0
    99          张三   0
    0           李四   0
    99          李四   0
    99          王五   0
    99          赵六   0
    0           赵六   0
    99          X    0
    0           Y    0
    */
    
    --更新
    update @A表 set int3=1 from @A表 a 
    left join 
    (
    	select name from @A表 
    	group by name having(count(1)>1)
    ) b on a.name=b.name 
    where b.name is not null and intType=0
    
    --更新后
    select * from @A表
    /*
    intType     name int3
    ----------- ---- -----------
    0           张三   1
    99          张三   0
    0           李四   1
    99          李四   0
    99          王五   0
    99          赵六   0
    0           赵六   1
    99          X    0
    0           Y    0
    */


    2012年6月28日 6:09
    版主
  • 个人感觉用inner join会比较好

    --更新
    update @A表 set int3=1 from @A表 a 
    INNER  join 
    (
    select name from @A表 
    group by name having(count(1)>1)
    ) b on a.name=b.name 
    where   intType=0

    --扩展一下,显示name列哪些重复,重复的个数

    SELECT   name ,COUNT(*) FROM @A表 GROUP BY name HAVING  COUNT(1)> 1


    给我写信: QQ我:点击这里给我发消息

    2012年6月28日 12:25
  • 谢谢。。高手!
    2012年6月28日 15:10