【问题标题】:Can I delete database duplicates based on multiple columns?我可以删除基于多列的数据库重复项吗?
【发布时间】:2012-11-29 23:05:27
【问题描述】:

asked this question a while back 删除基于列的重复记录。答案很有效:

delete from tbl
where id NOT in
(
select  min(id)
from tbl
group by sourceid
)

我现在有一个类似的情况,但是重复记录的定义是基于多列的。如何更改上述 SQL 以识别重复记录,其中唯一记录定义为从 Col1 + Col2 + Col3 连接。我会做这样的事情吗?

delete from tbl
where id NOT in
(
select  min(id)
from tbl
group by col1, col2, col3
)

【问题讨论】:

  • 原则仍然有效——分组是由一列还是多列无关紧要。您将只保留组中的第一行。但是-如果您不介意我说-请务必在发出删除命令之前检查您的数据。将删除转换为选择,看看什么会/不会存活。
  • @Nikola Markovinovic - 看起来它在做正确的事,但只是想确认
  • @leora 我发现您用于概念化/逆向工程的语法很麻烦。而且它不能很好地转化为 id 可能为 null 的情况(因为当涉及到 null 时,not in 的行为与您预期的不同)。我意识到这不太可能是一个因素,但了解 CTE 和 NOT EXISTS 很重要,因为它可能...
  • 你没有说 SQL Server 的版本。 2005 年? 2008 年? 2012 年?

标签: sql-server database


【解决方案1】:

这显示了您要保留的行:

;WITH x AS 
(
  SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
      (PARTITION BY col1, col2, col3 ORDER BY id)
  FROM dbo.tbl
)
SELECT col1, col2, col3 FROM x WHERE rn = 1;

这显示了您要删除的行:

;WITH x AS 
(
  SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
      (PARTITION BY col1, col2, col3 ORDER BY id)
  FROM dbo.tbl
)
SELECT col1, col2, col3 FROM x WHERE rn > 1;

一旦你对以上两组正确感到满意,以下实际上将删除它们:

;WITH x AS 
(
  SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
      (PARTITION BY col1, col2, col3 ORDER BY id)
  FROM dbo.tbl
)
DELETE x WHERE rn > 1;

请注意,在所有三个查询中,前 6 行是相同的,只有 CTE 之后的后续查询发生了变化。

【讨论】:

  • 伟大的解决方案亚伦!
【解决方案2】:

试试这个。 我创建了一个包含三列的表 tblA

CREATE TABLE tblA
(
id int IDENTITY(1, 1),
colA int, 
colB int, 
colC int
)

并添加了一些重复值。

INSERT INTO tblA VALUES (1, 2, 3)
INSERT INTO tblA VALUES (1, 2, 3)
INSERT INTO tblA VALUES (4, 5, 6)
INSERT INTO tblA VALUES (7, 8, 9)
INSERT INTO tblA VALUES (7, 8, 9)

如果您在下面的语句中将 select 替换为 delete,您的多列删除将起作用。

SELECT MIN(Id) as id
FROM
(
SELECT COUNT(*) as aantal, a.colA, a.colB, a.colC
FROM tblA       a
INNER JOIN tblA b   ON b.ColA = a.ColA
                    AND b.ColB = a.ColB
                    AND b.ColC = a.ColC
GROUP BY a.id, a.colA, a.colB, a.colC
HAVING COUNT(*) > 1
) c
INNER JOIN tblA d ON d.ColA = c.ColA
                    AND d.ColB = c.ColB
                    AND d.ColC = c.ColC
GROUP BY d.colA, d.colB, d.colC

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多