【问题标题】:finding duplicates and removing but keeping one value [duplicate]查找重复项并删除但保留一个值[重复]
【发布时间】:2013-08-21 06:52:08
【问题描述】:

我的数据库中目前有一个 URL 重定向表,其中包含约 8000 行,其中约 6000 行是重复的。

我想知道是否有一种方法可以根据某个列的值删除这些重复项,如果匹配,我希望使用我的“old_url”列来查找重复项,并且我已经使用了

SELECT old_url
    ,DuplicateCount = COUNT(1)
FROM tbl_ecom_url_redirect
GROUP BY old_url
HAVING COUNT(1) > 1  -- more than one value
ORDER BY COUNT(1) DESC -- sort by most duplicates

但是我不确定我现在可以做些什么来删除它们,因为我不想丢失每一个,只是重复。它们几乎完全匹配,除了有时 new_url 不同并且 url_id (GUID) 每次都不同

【问题讨论】:

  • 完成后,记得在表中添加UNIQUE 约束,这样您就不必再做这项工作了。
  • 唯一的问题是。我不能真正摆弄数据库,因为它不是供个人使用的,不过我会建议这样做。

标签: sql sql-server


【解决方案1】:

在我看来ranking functions 和CTE 是最简单的方法:

WITH CTE AS
(
    SELECT old_url
          ,Num = ROW_NUMBER()OVER(PARTITION BY old_url ORDER BY DateColumn ASC)
    FROM tbl_ecom_url_redirect
)
DELETE FROM CTE WHERE Num > 1

相应地更改ORDER BY DateColumn ASC 以确定应删除哪些记录以及应保留哪些记录。在这种情况下,我会删除所有较新的重复项。

【讨论】:

  • 您好,非常感谢!这似乎对我很有用。我非常感谢您的帮助,并感谢您提供清晰的解释和信息链接。
【解决方案2】:

如果您的表有主键,那么这很简单:

BEGIN TRAN
CREATE TABLE #T(Id INT, OldUrl VARCHAR(MAX))

INSERT INTO #T VALUES 
    (1, 'foo'),
    (2, 'moo'),
    (3, 'foo'),
    (4, 'moo'),
    (5, 'foo'),
    (6, 'zoo'),
    (7, 'foo')

DELETE FROM #T WHERE Id NOT IN (
    SELECT MIN(Id) 
    FROM #T 
    GROUP BY OldUrl
    HAVING COUNT(OldUrl) = 1
    UNION 
    SELECT MIN(Id) 
    FROM #T 
    GROUP BY OldUrl
    HAVING COUNT(OldUrl) > 1)

SELECT * FROM #T

DROP TABLE #T

ROLLBACK

【讨论】:

  • 酷,我从你那里学到了一些东西 =)
【解决方案3】:

这是用guid删除多条记录的示例,希望对你有帮助=)

DECLARE @t1 TABLE
(
DupID UNIQUEIDENTIFIER,
DupRecords NVARCHAR(255)
)

INSERT INTO @t1 VALUES 
(NEWID(),'A1'),
(NEWID(),'A1'),
(NEWID(),'A2'),
(NEWID(),'A1'),
(NEWID(),'A3')

所以现在,在@t1 中创建了一个带有 guid 的重复记录

;WITH CTE AS(
SELECT DupID,DupRecords, Rn = ROW_NUMBER()
OVER (PARTITION BY DupRecords ORDER BY DupRecords)
FROM @t1 
)
DELETE FROM @t1 WHERE DupID IN (SELECT DupID FROM CTE WHERE RN>1)

通过上面的查询,重复记录从@t1 中删除,我使用 Row_number() 来区分每条记录

SELECT * FROM @t1

【讨论】:

  • 我不太明白这是在做什么,请你给我解释一下吗?
  • k,我马上更新
  • 最好是你运行我的查询到 c 发生了什么 =)
猜你喜欢
  • 2016-09-18
  • 2015-09-27
  • 2013-07-10
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
相关资源
最近更新 更多