如何使用条件删除重复数据

时间:2015-07-02 08:43:08

标签: mysql oracle

我已经找到了删除重复数据的查询

DELETE FROM tbl_test t
  WHERE t.ROWID > ANY (SELECT b.ROWID
                          FROM tbl_test b
                         WHERE b.ser_no = t.ser_no
                       );

这给了我199条记录是正确的。 由于重复记录的状态为L,F或R.所以我必须删除所有F或R的记录。

例如,如果我有两个记录

ID  ser_no   Sta
1    20       L
2    20       F
3    15       R
4    15       L
5    89       L
6    89       F
7    10       R
8    10       R

因此,只有一个状态R或F的副本应该被删除。没有复制品具有LL或F,R状态的情况 所以我试过

DELETE FROM tbl_test t
      WHERE t.ROWID > ANY (SELECT b.ROWID
                              FROM tbl_test b
                             WHERE b.ser_no = t.ser_no
                             AND b.Sta<>'L'
                           );

它不起作用。它显示125条记录。

最终结果应为

ID  ser_no   Sta
    2    20       F
    3    15       R
    6    89       F
    8    10       R

2 个答案:

答案 0 :(得分:1)

尝试使用此delete语句,它的工作方式与规则相同,并为您的示例提供了正确的输出:

SQLFiddle

delete from tbl_test t 
  where t.sta in ('F', 'R') and exists ( 
      select 1 from tbl_test b 
        where b.ser_no = t.ser_no 
          and (sta='L' or (sta<>'L' and b.id<t.id)) )

答案 1 :(得分:0)

尝试此查询

DELETE FROM tbl_test t
      WHERE t.ROWID in (SELECT max(b.ROWID)
                              FROM tbl_test b
                             where b.Sta in('R','F')
                             group by b.ser_no,b.Sta
                           );