SQL Server 2008重复数据删除

长话短说,我接手了一个项目,数据库中的表格非常需要重复删除。该表如下所示:
supply_req_id | int      | [primary key]
supply_req_dt | datetime | 
request_id    | int      | [foreign key]
supply_id     | int      | [foreign key]
is_disabled   | bit      |
存在具有相同request_id和supply_id的记录的复制。我想找到一种最佳实践方法来重置此表。 [编辑] @Kirk_Broadhurst,谢谢你的提问。由于在其他地方没有引用supply_req_id,我会回答说保留第一个,删除任何后续的出现。 节日快乐     
已邀请:
这将为(supply_req_dt,request_id)分组中的每一行创建一个等级,从1 =最低的supply_req_id开始。任何欺骗的值都大于1
;WITH cDupes AS
(
    SELECT
     supply_req_id,
     ROW_NUMBER() OVER (PARTITION BY supply_req_dt, request_id ORDER BY supply_req_id) AS RowNum
    FROM
     MyTable
)
DELETE
   cDupes
WHERE
   RowNum > 1
然后添加唯一约束或INDEX
CREATE UNIQUE INDEX IXU_NoDupes ON MyTable (supply_req_dt, request_id)
    
似乎应该有一个命令,但也许这是因为我习惯了不同的数据库服务器。这是相关的支持文档: 如何从SQL Server中的表中删除重复的行 http://support.microsoft.com/kb/139444     
您需要澄清您的规则,以确定在“匹配”的情况下要保留哪条记录 - 最新的,最早的,具有
is_disabled
真或假的记录? 一旦确定了该规则,剩下的就相当简单了: 选择要保留的记录 -
distinct
记录 联接回原始表以获取这些记录的ID。 删除不在已连接数据集中的内容。 因此,假设您想保留任何“重复”对的最新记录。您的查询将如下所示:
DELETE FROM [table] WHERE supply_req_id NOT IN
(SELECT supply_req_id from [table] t 
INNER JOIN
    (SELECT MAX(supply_req_dt) dt, request_id, supply_id 
    FROM [table] 
    GROUP BY request_id, supply_id) d
ON t.supply_req_dt = d.dt
AND t.request_id = d.request_id 
AND t.supply_id = d.supply_id)
问题是如果
supply_req_dt
也是重复的,那么你将保留两个副本。修复是做另一个
group by
并选择顶部
id
select MAX(supply_req_id), supply_req_dt, request_id, supply_id 
group by supply_req_dt, request_id, supply_id 
作为临时步骤。但如果你不需要这样做,不要打扰它。     

要回复问题请先登录注册