我有一个包含以下字段的表
Id Name IsPublic
我需要编写一个sql查询,将IsPublic更新为false,其中name有重复。只有一个副本应该具有IsPublic = true。
默认情况下IsPublic为真
答案 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