更新记录,除了TOP 1的记录

问题描述:

我有业务场景为更新记录,除了TOP 1的记录

  1. 我们会得到所有的数据到数据库中,包括重复

  2. 如果我们任何一个表中复制通过将所有剩余重复记录标志设为'X',从所有剩余重复记录标志取'X'取最近的记录

  3. 当处理到下一级时,通过标志!='X'过滤提取,因此我们只能得到一个最最近的记录来自al l一个重复的密钥。

如何更新除TOP 1记录以外的所有记录。

任何想法

感谢

prav

不知道这是什么,你的意思是:

UPDATE table 
    SET yourstuff 
WHERE yourclauses 
    AND table.ID <> (select TOP 1 ID from table where yourclauses) 
+1

加上'ORDER BY someorder'的子查询,你会得到我的投票:) – egrunin 2010-07-17 03:15:46

假设你必须有柱(一个或多个),可用于明确标识“最近”(以下称为datecol

UPDATE YourTable 
    SET YourTable.[flag] = 'X' 
FROM YourTable t1 
WHERE (not exists(
        select * from YourTable t2 
        where t2.[key] = t1.[key] and 
        t2.datecol > t2.datecol)) 

一个可更新CTE:

with cte as (
select *, row_number() over (partition by foo order by bar) as rn 
from table) 
update cte 
set flag = x 
where rn > 1; 

更新表名主
设置状态= 'X'
其中ROWID不
(选择MAX(ROWID)
从表名子
其中主要。 column1 = sub.column1
and sub.status = main.status)
and main.status <>'X'

请试试这个....

Declare @tbl as Table(ID int Identity(1,1),lName varchar(max),fName varchar(max),IsD bit default(0)) 

Insert into @tbl(lName,fName)values('XYZ','PQR'),('XYZ','PQR'),('XYZ','HHH'),('XYZ','HHH'),('P','o'),('P','o') 

update s 
    Set 
    S.IsD =1 
    from @tbl S Inner Join 
      (Select MIN(ID) ID,fName,lName from @tbl group by fName ,lName having count(*) > 1) M 
    on S.fName = M.fName and S.lName = s.lName 
    Where S.ID != M.ID 


Select * from @tbl