Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Doppelte Datensätze löschen (https://www.delphipraxis.net/184071-doppelte-datensaetze-loeschen.html)

Walter Landwehr 23. Feb 2015 17:25

Datenbank: Firebird • Version: 2.5.3 • Zugriff über: IBO

Doppelte Datensätze löschen
 
Hallo,

mit folgendem Befehl kann ich doppelte Datensätze finden.

select count(*), Patientnr, Datum, Suchwort, Anlage
from TBL_PATDIAGNOSE
group by Patientnr, Datum, Suchwort, Anlage
having count(*) > 1


aber wie kann ich die doppelten Datensätze per SQL auf einem Rutsch löschen. Es sind 7956 Datensätze doppelt.

Union 23. Feb 2015 17:29

AW: Doppelte Datensätze löschen
 
Hat die Tabelle TBL_PATDIAGNOSE eine eindeutige ID (PK)?

Walter Landwehr 23. Feb 2015 17:47

AW: Doppelte Datensätze löschen
 
Ja hat sie : PATDIAGNOSENR

Union 23. Feb 2015 17:56

AW: Doppelte Datensätze löschen
 
Dann in etwa so:
Code:
delete from TBL_PATDIAGNOSE A
where exists
(Select B.PATDIAGNOSENR from TBL_PATDIAGNOSE B where A.Patientnr = B.Patientnr and A.Datum = B.Datum and A.Suchwort = B.Suchwort and A.Anlage =   B.Anlage and A.PATDIAGNOSENR <> B.PATDIAGNOSENR)
Also diejenigen Sätze löschen bei denen alle Vergleichsfelder übereinstimmen AUSSER dem ID-Feld.

himitsu 23. Feb 2015 17:58

AW: Doppelte Datensätze löschen
 
SQL-Code:
select ID
from TBL_PATDIAGNOSE
where (
  select count(*) > 1
  from TBL_PATDIAGNOSE AS x
  where x.Patientnr = TBL_PATDIAGNOSE.Patientnr
    and x.Datum = TBL_PATDIAGNOSE.Datum
    and x.Suchwort = TBL_PATDIAGNOSE.Suchwort
    and x.Anlage = TBL_PATDIAGNOSE.Anlage
)
oder
SQL-Code:
select ID
from TBL_PATDIAGNOSE
where exists(
  select true
  from TBL_PATDIAGNOSE AS x
  where x.ID <> TBL_PATDIAGNOSE.ID
    and x.Patientnr = TBL_PATDIAGNOSE.Patientnr
    and x.Datum = TBL_PATDIAGNOSE.Datum
    and x.Suchwort = TBL_PATDIAGNOSE.Suchwort
    and x.Anlage = TBL_PATDIAGNOSE.Anlage
)

Und jetzt das ganze nur noch als
SQL-Code:
where ID in (...)
für das DELETE-Statement verwenden, aber vorer solltest du noch mindestens jeweils einen der Datensätze in einem der WHERE ausschließen ... und zwar jeweils Jenen, welchen du behalten willst, ansonsten sind wirklich alle Doppelten weg. :stupid:


Oder so wie Union, der aber ruhig noch einen UNION hätte einbauen können :angle2:

Der Vorteil bei "meinem" ist, daß man Dieses auch verwenden kann, um vorher zu Gucken, was man löschen würde ... falls man das mal wissen will.

Walter Landwehr 23. Feb 2015 18:00

AW: Doppelte Datensätze löschen
 
Danke hat Perfekt funktioniert.

Union 23. Feb 2015 20:43

AW: Doppelte Datensätze löschen
 
Für die Zukunft evtl. die DB oder die BL umgestalten, damit keine Duplikate mehr auftreten können und Du NIE WIEDER so ein Script brauchst.

Walter Landwehr 24. Feb 2015 12:37

AW: Doppelte Datensätze löschen
 
Hallo Union,

die doppelten Datensätze sind durch einen Trigger neu angelegt worden, die ich bei der Übernahme von einer Datenbank in eine andere übernommen habe. Ich hatte gar nicht mehr an den Trigger grdacht.

Doppelte Datensatz kann vom Anwender nicht erzeugt werden.

Vielen Dank nochmals für Deine Hilfe.

himitsu 24. Feb 2015 12:44

AW: Doppelte Datensätze löschen
 
Wäre das aber in der DB bereits unterbunden und nicht nur in der GUI, dann hätte der Trigger das auch nicht machen können. :angel:

Walter Landwehr 24. Feb 2015 14:43

AW: Doppelte Datensätze löschen
 
Und wie kann ich das verhindern? Etwa mit einem chek auf die Felder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:34 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz