Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Mina am August 09, 2016, 10:47:02

Titel: Löschabfrage
Beitrag von: Mina am August 09, 2016, 10:47:02
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
Titel: Re: Löschabfrage
Beitrag von: ebs17 am August 09, 2016, 11:15:18
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 (http://www.ms-office-forum.net/forum/showthread.php?t=317707) 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.
Titel: Re: Löschabfrage
Beitrag von: Mina am August 10, 2016, 12:55:59
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