更新重复记录

时间:2009-11-10 11:46:37

标签: sql-server tsql

我有一个包含以下字段的表

Id Name IsPublic

我需要编写一个sql查询,将IsPublic更新为false,其中name有重复。只有一个副本应该具有IsPublic = true。

默认情况下IsPublic为真

4 个答案:

答案 0 :(得分:2)

我建议采用子选择方法:

update tableName t1
   set IsPublic = false
 where exists(select ID 
                from tableName t2 
               where t1.name = t2.name 
                 and t2.Id < t1.Id)

为了确保其中一个副本保留其IsPublic = true,我在子选择中使用了一个额外的where子句:and t2.Id < t1.Id。具有最低Id值的副本保留IsPublic = true,而具有相同名称的所有其他记录将其IsPublic设置为false。

答案 1 :(得分:1)

update
  table
set
  isPublic = false
from
  table t
    inner join table t2 on (t.name = t2.name and t.id < t2.id)
where
  isPublic = true

答案 2 :(得分:0)

对于保留项目的所有重复项,应将isPublic设置为false,并为名称字段具有相同值的每组项目使用mininmun ID:

UPDATE
    MyTable
SET 
    isPublic = false
WHERE   
    Id NOT IN
    (SELECT   
          MIN(Id)
     FROM 
          MyTable
     GROUP BY 
          Name 
    )

答案 3 :(得分:0)

declare @t table(Id int, Name varchar, IsPublic bit)
insert into @t(Id, Name) values(1, 'a')
insert into @t(Id, Name) values(2, 'b')
insert into @t(Id, Name) values(3, 'b')

update a
set IsPublic = isnull( (select 0 from @t b where a.Name = b.Name and a.id > b.id), 1)
from @t a

select * from @t

具有最小ID的非唯一记录获得IsPublic = 1