1

长话短说,我接手了一个项目,数据库中的一个表非常需要重复数据删除。该表如下所示:

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 没有在其他任何地方引用,我会回答说保留第一个,删除任何后续事件。

节日快乐

4

3 回答 3

3

这会为 (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)
于 2010-12-17T04:40:09.010 回答
2

似乎应该有一个命令,但也许那是因为我习惯了不同的数据库服务器。这是相关的支持文档:

如何从 SQL Server 中的表中删除重复行 http://support.microsoft.com/kb/139444

于 2010-12-17T04:17:03.367 回答
2

您需要澄清您的规则,以确定在“匹配”的情况下保留哪些记录 - 最新的、最早的、具有is_disabled真实性或虚假性的记录?

一旦您确定了该规则,剩下的就相当简单了:

  1. 选择您要保留的记录 -distinct记录
  2. 加入原始表以获取这些记录的 ID。
  3. 删除连接数据集中没有的所有内容。

因此,假设您要保留任何“重复”对的最新记录。您的查询将如下所示:

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 

作为临时步骤。但是,如果您不需要这样做,请不要打扰它。

于 2010-12-17T04:39:40.910 回答