请教各位高手,先多谢了。有数据如下:
id    code    name
1      A         NULL
2      A         半夏
3      B         半夏
4      B         忍冬
5      C         忍冬
6      D         素问
code 非空,name 有空值。
需根据code、name字段查重。只要有一个字段相同即为重复:
如id为1、2时: code重复;id为2、3时,name重复,因此1、2、3行重复。
如上数据,则第1至第5条记录重复。
要求找出重复值,将其对应id改为max(id),记为newid,并插入源数据表。
结果如下所示:
id    newid    code    name
1       5          A         NULL
2       5          A         半夏
3       5          B         半夏
4       5          B         忍冬
5       5          C         忍冬
6       6          D         素问

解决方案 »

  1.   

    我的理解,楼主的意思实际上只须一条Update语句就可以解决了
    即将有重复的记录的newid改为重复记录中最大的id即可
      

  2.   


    可是如何找出重复值?
    假设知道前5条记录重复,怎么写update语句?
      

  3.   

    如果数据是这样,应该是什么结果呢?id    code    name
    1      A         NULL
    2      B         半夏
    3      B         忍冬
    4      C         忍冬
    5      D         素问
    6      A         半夏
      

  4.   

    code字段1和6行重复,name字段2和6行重复,所以1、2、6行重复
    再看code字段,2和3行重复,name字段3和4行重复,所以2、3、4行重复
    由上,1、2、3、4、6行重复。
    结果为:
    id newid    code    name
    1    6      A         NULL
    2    6      B         半夏
    3    6      B         忍冬
    4    6      C         忍冬
    5    5      D         素问
    6    6      A         半夏
      

  5.   


    可是如何找出重复值?
    假设知道前5条记录重复,怎么写update语句?--先更新newid等于id
    update tb set newid=id--然后更新重复的newid
    update t1 set t1.newid=t2.MaxId
    from tb t1 inner join (select id,max(id) Maxid from tb t3 where exists(select 1 from tb t4 where t4.id=t3.id group by t4.code haveing count(*)>1) or exists(select 1 from tb t5 where t5.id=t3.id group by t5.[name] haveing count(*)>1))) t2 on t1.id=t2.id