【问题标题】:Delete duplicate records from a table only if the count is greater than 3仅当计数大于 3 时才从表中删除重复记录
【发布时间】:2015-06-09 19:29:35
【问题描述】:

我有一张如下表:

A|B|C

1|2|3

1|2|3

1|2|3

1|2|3

1|2|3

4|5|6

4|5|6

4|5|6

4|5|6

7|8|9

7|8|9

7|8|9

我想删除重复项并只保留出现超过 3 次的记录的一个值。应该是这样的:

A|B|C

1|2|3

4|5|6

7|8|9

7|8|9

7|8|9

我有以下代码:

DELETE FROM test5 X
WHERE x.ROWID > ANY
  (SELECT Y.ROWID
    FROM test5 Y
    WHERE
      X.A = Y.A
     AND
      X.B = Y.B
    AND
      X.C = Y.C
    ); 

如何只保留前两个元组(123 和 456)的一个副本并保留第三个元组的所有副本?

【问题讨论】:

标签: oracle plsql


【解决方案1】:

如果我清楚地理解您的问题,为什么不使用子查询将删除限制在具有所需值的那些行。像这样的:

DELETE FROM test5 x
WHERE x.ROWID >
ANY( select y.ROWID
FROM test5 y
WHERE X.AA = Y.AA
    AND
      X.BB = Y.BB
    AND
      X.CC = Y.CC)
AND (X.AA, X.BB, X.CC) IN (
SELECT AA, BB, CC FROM TEST5
GROUP BY AA, BB, CC
HAVING COUNT(AA) > 3);

这应该只删除前两个元组的重复项。

【讨论】:

  • 您的建议对输出没有任何影响。请正确阅读问题。
  • @user3803989 更新后的答案是一个通用脚本,如果超过 3 个,则删除所有重复项。
  • 完美运行。谢谢。
【解决方案2】:

以下语句将删除表中出现超过 3 次的所有行(最旧的行除外)。

delete test5 where rowid in (
  with data as(
  select a,b,c, min(rowid) keep_rowid
  from test5 
  group by a,b,c
  having count(*) > 3)
  select t.rowid from test5 t, data d
  where t.a = d.a
  and t.b = d.b
  and t.c = d.c
  and t.rowid <> d.keep_rowid);

【讨论】:

    【解决方案3】:

    你可以试试这个:

    delete test5
     where rowid not in (select rowss
                           from (select A, count(*) counts, min(rowid) rowss
                                   from test5
                                  group by A
                                 having count(*) > 3))--keep one row which's count bigger then 3 (like 1|2|3,4|5|6)
       and A not in(select A from test5 group by A having count(*) <= 3)--keep rows which's counts smaller and equal then 3 (like 7|8|9)
    

    表名和列名应该是错误的抱歉。

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 2021-04-01
      • 2019-01-28
      • 2015-06-25
      • 1970-01-01
      • 2016-01-07
      • 2013-05-03
      • 2019-11-25
      相关资源
      最近更新 更多