删除Oracle表中除最旧值之外的所有重复记录

Cia*_*uen 4 sql oracle

我有2个表,一个父TableA和一个子TableB.TableB具有一个或多个具有TableA中父记录的记录.我需要删除TableB中除最早日期之外的所有记录,即表B中的所有重复项.我不认为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
Run Code Online (Sandbox Code Playgroud)

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

delete from TableB where PayDate not in (
  select min(PayDate)from TableB
  having ( count(PayDate) > 1 )
)
Run Code Online (Sandbox Code Playgroud)

Vin*_*rat 16

您可以使用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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

  • @Ciaran:您需要指定要删除哪个secID,或许类似于`DELETE FROM TableB WHERE(secID,PayDate)NOT IN(SELECT secID,MIN(PayDate)FROM TableB GROUP BY secID) (2认同)

Bal*_*mar 6

 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
Run Code Online (Sandbox Code Playgroud)

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

delete from TABLE a where rowid<(select max(rowid) from TABLE b where a.ID = b.ID)

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

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