7 votes

Supprimez tous les enregistrements en double de la table Oracle, sauf le plus ancien.

J'ai 2 tables, une TableA parent et une TableB enfant. La TableB contient un ou plusieurs enregistrements dont le parent se trouve dans la TableA. J'ai besoin de supprimer tous les enregistrements de TableB sauf le plus ancien, c'est-à-dire tous les doublons de TableB. Je ne pense pas que la TableA doive être impliquée dans la déclaration mais je l'inclus juste pour référence.

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

Ainsi, dans le tableau B ci-dessus, je dois supprimer les enregistrements 17, 20 et 21, laissant un enregistrement pour chaque SecID. Jusqu'à présent, j'ai obtenu les résultats suivants, mais pour une raison quelconque, ils incluent l'enregistrement le plus ancien, que je veux conserver :

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

20voto

Vincent Malgrat Points 42899

Vous pouvez utiliser le ROWID et l'analytique :

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

Vous pouvez également utiliser une semi-jonction plus conventionnelle :

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

7voto

Bala Kumar Points 67

TABLEAU

 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

Pour supprimer tous les enregistrements en double, sauf un

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

Pour supprimer les enregistrements en double spécifiques, sauf un

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

0voto

Csanesz Points 90
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
)

Cela va permettre tous unique rowids et à l'exception de ces rowid-s, le sql va supprimer toutes les lignes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X