【问题标题】:Delete all duplicate records from Oracle table except oldest从 Oracle 表中删除所有重复记录,但最旧的除外
【发布时间】:2011-07-03 12:48:01
【问题描述】:

我有 2 个表,一个父 TableA 和一个子 TableB。表 B 有 1 条或多条记录,表 A 中有一条父记录。我需要从 TableB 中删除所有记录,但最早的日期除外,即 TableB 中的所有重复项。我认为 TableA 不需要参与该声明,但我将其包括在内仅供参考。

TableA 
_______ 
SecID, SecName 
1,     Sec1
2,     Sec2
3,     Sec3
4,     Sec4

TableB
_________
IncID, SecID, PayDate 
16,    1,     11/03/2011
17,    1,     11/04/2011
18,    2,     10/01/2011
19,    3,     01/06/2011
20,    3,     01/09/2011
21,    3,     01/12/2011
22,    4,     10/06/2011

所以在上面的表 B 中,我需要删除记录 17、20 和 21,为每个 SecID 留下一条记录。到目前为止,我有以下但由于某种原因它包括我想保留的最早记录:

delete from TableB where PayDate not in (
  select min(PayDate)from TableB
  having ( count(PayDate) > 1 )
)

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以使用 ROWID 和分析:

    SQL> DELETE FROM tableB
      2   WHERE ROWID NOT IN
      3           (SELECT first_value(ROWID)over(PARTITION BY secID ORDER BY paydate)
      4              FROM tableB);
    
    3 rows deleted
    
    SQL> select * from tableB;
    
         INCID      SECID PAYDATE
    ---------- ---------- -----------
            16          1 11/03/2011
            18          2 10/01/2011
            19          3 01/06/2011
            22          4 10/06/2011
    

    您也可以使用更传统的半连接:

    SQL> DELETE FROM tableB b_out
      2   WHERE EXISTS (SELECT NULL
      3                   FROM tableB b_in
      4                  WHERE b_in.secID = b_out.secID
      5                    AND b_in.paydate < b_out.paydate);
    
    3 rows deleted
    

    【讨论】:

    • 您好文森特,感谢您的回复。我尝试了半连接,它看起来应该可以工作,但它保留了最新的记录而不是最旧的记录。
    • @Ciaran:你说得对,我没有检查结果。我已经更新了我的答案,它现在应该可以工作了。
    • 这是一个欢呼。知道为什么我的原始查询不起作用吗?
    • @Ciaran:您需要指定要删除的 secID,可能类似于 DELETE FROM TableB WHERE (secID, PayDate) NOT IN (SELECT secID, MIN(PayDate) FROM TableB GROUP BY secID)
    • 很好地发现,你上面的查询都返回相同的结果..cheers
    【解决方案2】:

    表格

     ID    RefCode   Code_Desc
     122   B122      The Notebook
     122   B122      The Notebook
     122   B122      The Notebook
     123   B123      A Walk to Remember
     123   B123      A Walk to Remember
     123   B123      A Walk to Remember
     123   B123      A Walk to Remember
    

    删除除一个以外的所有重复记录

    delete from TABLE a where rowid&lt;(select max(rowid) from TABLE b where a.ID = b.ID)

    删除除一个以外的特定重复记录

    delete from TABLE a where rowid&lt;(select max(rowid) from TABLE b where a.ID = b.ID and a.ID = 122)

    【讨论】:

      【解决方案3】:
      delete from your_table a
      where a.rowid not in 
      (
        select max(b.rowid) from your_table b
        group by b.col1,b.col2....b.coln
      )
      

      这将获得 all unique rowids,除了这些 rowid-s 之外,sql 将删除所有行。

      【讨论】:

        猜你喜欢
        • 2012-10-01
        • 2019-11-25
        • 2011-08-18
        • 1970-01-01
        • 2016-10-24
        • 2011-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多