7
votes

Supprimer tous les enregistrements en double de Oracle Table sauf la plus ancienne

J'ai 2 tables, un tablier parent et une petite table g.. TABLEB a 1 ou plusieurs enregistrements avec un enregistrement parent en tablea. J'ai besoin de supprimer tous les enregistrements de tableb, sauf la date la plus ancienne à savoir, tous les doublons de la tableb. Je ne pense pas que le tableau doit être impliqué dans la déclaration, mais j'y comprends juste pour référence. XXX

Donc, dans la tablebe ci-dessus, j'ai besoin de supprimer des enregistrements 17, 20 et 21 en laissant un enregistrement pour chaque secide. Jusqu'à présent, j'ai ci-dessous, mais pour une raison quelconque, il comprend le dossier le plus ancien que je veux garder: xxx


0 commentaires

3 Réponses :


20
votes

Vous pouvez utiliser Rowid and Analytics:

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


5 commentaires

Salut Vincent Merci pour la réponse. J'ai essayé la demi-jointure et on dirait que cela devrait fonctionner, mais il garde le dernier enregistrement au lieu des plus anciens.


@Ciaran: Tu as raison, je n'avais pas vérifié le résultat. J'ai mis à jour ma réponse, cela devrait fonctionner maintenant.


C'est celui qui accueille. Une idée pourquoi ma requête originale ne fonctionne pas?


@Ciaran: Vous auriez besoin de spécifier quelle Secide à supprimer, peut-être quelque chose comme Suppr de tableb où (Secide, Paydate) non dans (Sélectionnez Secide, Min (Paydate) du groupe TABLEB par Secide)


bien repéré que et votre requête ci-dessus renvoie les mêmes résultats..cheers



7
votes

table xxx

pour supprimer tous les enregistrements en double sauf un

Supprimer du tableau A Où Rowid <(Sélectionnez max (Rowid) du tableau B où A.Id = b.Id)

Pour supprimer des enregistrements de dupliqués spécifiques, sauf un

Supprimer du tableau A Où Rowid <(Sélectionnez max (Rowid) du tableau B où A.Id = B.Id et A.Id = 122)


0 commentaires

0
votes
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
)
This will get all unique rowids and except these rowid-s the sql will delete all rows.

0 commentaires