Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Löschabfrage

Begonnen von Mina, August 09, 2016, 10:47:02

⏪ vorheriges - nächstes ⏩

Mina

Hallo Forum,

ich bin zum ersten mal hier und möchte Euch erstmal begrüßen.
Ich habe eine Löschabfrage erstellt, die nicht funktioniert und ich weiß nicht warum.
Es geht darum, dass ich mehrere identische Datensätze habe mit der selben Nr (Patistammnr)
Ich möchte Sie auf einen Datensatz eindampfen. Dafür erstellte ich eine Duplikateabfrage und danach habe ich eine löschabrage daraus gemacht und eine Unterabrage mit folgendem Eintrag bei Patistammnr.

In (select Min([Su_Resultate1].[PATISTAMMNR]) as MinvonPatistammnr from [Su_Resultate1] group by [Su_Resultate1].[NAME], [Su_Resultate1].[VORNAME], [Su_Resultate1].[GEBDAT], [Su_Resultate1].[EINSKURZ], [Su_Resultate1].[LABEINDAT], [Su_Resultate1].[ERGEBNIST1], [Su_Resultate1].[ERGEBNIST2] having (((count([Su_Resultate1].[NAME]))>1) and ((count([Su_Resultate1].[VORNAME]))>1) and ((count([Su_Resultate1].[EINSKURZ]))>1) and ((count([Su_Resultate1].[LABEINDAT]))>1) and ((count([Su_Resultate1].[ERGEBNIST1]))>1) and ((count([Su_Resultate1]))>1) and ((count([Su_Resultate1].[ERGEBNIST2]))>1)))

Wenn ich die Abrage ausführe dauert es erstmal ziemlich lang (>80 000 Datensätze) und danach möchte er alle Löschen.

Es wäre schön wenn ihr mir sagen könntet, was ich falsch mache

Gruß
Mina

ebs17

#1
In der Unterabfrage findet eine erhebliche Gruppierung + Aggregierung statt. Das ist Aufwand.
Unterabfragen im WHERE-Teil können/werden mehrfach bis vielfach ausgeführt. Das vervielfacht Aufwand.
Viel Aufwand bei dann auch höherer Datenmenge und ohne Indexnutzung wird dann auch spürbar bis belastend, auch bei Hardware neuerer Generation.

ZitatEs geht darum, dass ich mehrere identische Datensätze habe mit der selben Nr (Patistammnr)
Warum beschäftigst Du Dich beim Gruppieren mit dann unnötigen Feldern.

Beispielhafte vollständige(!!) Löschabfrage:
DELETE
FROM
   TabX AS A
WHERE
   EXISTS
      (
         SELECT
            NULL
         FROM
            TabX AS B
         WHERE
            B.Patistammnr = A.Patistammnr
               AND
            B.ID < A.ID
      )

Hier wird alles gelöscht, wo es eine gleiche Patistammnr und eine höhere ID als die niedrigste ID zur Patistammnr gibt.

Weniger Aufwand geht wohl kaum, und spätestens mit einem Index auf beide Felder läuft die Abfrage sehr zügig.
Mit freundlichem Glück Auf!

Eberhard

Mina

Hallo,

herzlichen Dank für Eure Mühe. Ich muss  rumprobieren was schlußendlich für mich die richtige Lösung ist.
Du hast mir auf jeden Fall mal weiter geholfen.

Gruß
Mina