Ich habe eine Tabellentransaktion, die Duplikate hat. Ich möchte den Datensatz behalten, der minimale ID hatte, und lösche alle Duplikate basierend auf vier Feldern DATE, AMOUNT, REFNUMBER, PARENTFOLDERID. Ich habe diese Abfrage geschrieben, aber ich bin mir nicht sicher, ob dies auf effiziente Weise geschrieben werden kann. Denkst du, dass es einen besseren Weg gibt? Ich frage, weil ich mir Sorgen um die Laufzeit mache.SQL zum Löschen der Duplikate in einer Tabelle
DELETE FROM TRANSACTION
WHERE ID IN
(SELECT FIT2.ID
FROM
(SELECT MIN(ID) AS ID, FIT.DATE, FIT.AMOUNT, FIT.REFNUMBER, FIT.PARENTFOLDERID
FROM EWORK.TRANSACTION FIT
GROUP BY FIT.DATE, FIT.AMOUNT , FIT.REFNUMBER, FIT.PARENTFOLDERID
HAVING COUNT(1)>1 and FIT.AMOUNT >0) FIT1,
EWORK.TRANSACTION FIT2
WHERE FIT1.DATE=FIT2.DATE AND
FIT1.AMOUNT=FIT2.AMOUNT AND
FIT1.REFNUMBER=FIT2.REFNUMBER AND
FIT1.PARENTFOLDERID=FIT2.PARENTFOLDERID AND
FIT1.ID<>FIT2.ID)
versuchen Ja das funktioniert. Ich bin mir nicht sicher über die Leistung, aber es sieht besser lesbar aus. – mahen
@justin: Ich denke, mit der analytischen Funktion ist viel mehr optimiert. Was Sie sagen? –
@GauravSoni - Ich würde nicht erwarten, dass es in diesem Fall effizienter ist. Mit meinem oder Ihrem Ansatz muss Oracle zweimal die "transaction" -Tabelle treffen. Ich würde eher erwarten, dass ein Anti-Join etwas effizienter ist als der analytische Funktionsansatz. Aber es hängt von den verfügbaren Indizes, den Daten, der Anzahl der doppelten Zeilen usw. ab. Ich wäre nicht schockiert, wenn in einigen Fällen der analytische Funktionsansatz ein wenig effizienter wäre, aber ich würde erwarten, dass er einigermaßen nahe kommt . –