1

我有一个包含用户名和已删除状态的表。重复的用户名已删除状态组合是可能的。如果用户名有多个条目的已删除状态为 1,那么我需要将每个用户名的一个条目的已删除状态更新为 0。

考虑以下数据:

Name  EmpId  Deleted
--------------------
A     01     1
A     01     1
B     02     1
B     02     0
C     03     1

要求:名称 A 和 C 的一项应更新为 0(已删除状态)。

declare @testTable table (Name varchar(10), EmpId varchar(10), Deleted tinyint)

insert into @testTable
select 'A', '01', 1 UNION ALL
select 'A', '01', 1 UNION ALL
select 'B', '02', 1 UNION ALL
select 'B', '02', 0 UNION ALL
select 'C', '03', 1

select * from @testTable
4

5 回答 5

1

尝试这个;

;with cte as
(
  select name, empId, deleted, 
         row_number() over (partition by name, empId order by deleted desc) rn
  from T
)
Update cte set deleted = 0
where rn <> 1 and deleted = 1

SQL 小提琴演示

于 2013-02-12T11:34:46.680 回答
1

这是一种方法:

with toupdate as (
      select t.*,
             row_number() over (partition by name, deleted order by deleted) as seqnum
      from t
     )
update toupdate
    set deleted = 0
    where deleted = 1 and seqnum = 1
于 2013-02-12T11:35:23.317 回答
1

SqlFillde 演示

with t1 as 
(
select *, ROW_NUMBER() OVER 
           (PARTITION BY EMPID order by deleted) as rn
       from testtable
)
update t1 set deleted=0 where rn=1 and deleted=1
于 2013-02-12T11:46:16.683 回答
1
declare @testTable table 
(
    Name varchar(10), 
    EmpId varchar(10), 
    Deleted tinyint
)

insert into @testTable
select 'A', '01', 1 UNION ALL
select 'A', '01', 1 UNION ALL
select 'A', '01', 1 UNION ALL
select 'B', '02', 1 UNION ALL
select 'B', '02', 0 UNION ALL
select 'B', '02', 0 UNION ALL
select 'C', '03', 1

select * from @testTable
update @testTable set deleted=1
BEGIN
with t1 as 
(
select *, ROW_NUMBER() OVER 
           (PARTITION BY EMPID order by deleted) as rn
       from @testTable
)
update t1 set deleted=0 where rn=1 and deleted=1
END
select * from @testTable
于 2013-02-12T11:48:56.417 回答
0
    UPDATE A
    SET Deleted = (CASE WHEN RowNum = 1 THEN 0 ELSE Deleted END)
    FROM
    (SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Deleted) AS RowNum
    FROM @testTable A WHERE Name NOT IN (SELECT Name FRom @testTable B Where Deleted=0)
    ) A
于 2014-01-14T12:52:42.407 回答