【问题标题】:Delete ALL rows that have a duplicate ID删除所有具有重复 ID 的行
【发布时间】:2017-11-29 04:26:04
【问题描述】:

在 SO 上有很多帖子,其中给出了一种解决方案,即取出以一种方式存在的行或与其他行形成重复,只留下 1 个。

我正在寻找的是如何从我的临时表中删除所有没有唯一 ID 的行:

ID    other_values
-----------------------------
 1    foo bar
 2    bar baz
 2    null
 2    something
 3    else

我不关心其他价值观;一旦ID 不是唯一的,我想要所有行,结果是:

ID    other_values
-----------------------------
 1    foo bar
 3    else

我该怎么做?

【问题讨论】:

标签: sql sql-server-2012


【解决方案1】:

试试这个:

--delete all rows from my temp-table that do not have a unique ID
DELETE from MYTABLE
WHERE ID IN (SELECT ID FROM MYTABLE GROUP BY ID HAVING COUNT(*) > 1)

【讨论】:

  • 这将删除所有重复项而不保留 1。也就是说,如果一个 ID 有多个,它将​​完全删除该 ID,而不是只删除一个实例。
  • @scsimon 这正是 OP 想要的
【解决方案2】:

我会结合使用 DELETE 命令和子查询来检测重复项

DELETE
FROM mytable
WHERE ID IN (SELECT ID FROM mytable GROUP BY ID HAVING COUNT(*) > 1)

【讨论】:

  • 这将删除所有重复项而不保留 1。也就是说,如果一个 ID 有多个,它将​​完全删除该 ID,而不是只删除一个实例之外的所有实例
  • 这正是 OP 想要的!查看他的示例结果集。所有 ID=2 的行都已被删除。
【解决方案3】:

使用 Cte 删除行。

WITH cte
AS (
    SELECT id
        ,Other_values
        ,ROW_NUMBER() OVER (
            PARTITION BY id ORDER BY id
            ) rownum
    FROM mytable
    )
DELETE
FROM cte
WHERE rownum > 1

【讨论】:

  • 这将留下重复的行之一。这不是 OP 想要的。
猜你喜欢
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 2012-11-19
相关资源
最近更新 更多