MDB - Lange Antwortzeiten bei "NOT IN" Abfrage

Loipe

Grünschnabel
Hallo,

ich habe folgende Abfrage

SELECT * FROM Kunde WHERE Nr NOT IN (SELECT DISTINCT Nr FROM Kauf WHERE Datum > #2007-05-01#)

Die Abfrage bei ca. 1000 Einträgen in der Tabelle Kunde dauert ca. 30 Sekunden. Kann mir jemand einen Tip geben, wie ich diese Abfrage schneller machen kann ?

Das Problem liegt noch in der Tabelle Kauf.
Ein Kunde z.B. mit der Nr 100 hat in der Tabelle Kauf z.B. 3 Einträge mit verschiedenem Datum.
Nun muss ich erst mal das aktuellste Datum der 3 Einträge rausfinden und dann schauen ob es älter ist als das Datum in der Abfrage. Wenn Ja, dann sollen der Name des Kunden mit der Nr 100 ausgegeben werden. Ist das aktuellste Datum jünger als das in der Abfrage, dann darf diese nicht ausgegeben werden.
Das ganze muss natürlich auch mit den restlichen Einträgen in der Tabelle Kauf gemacht werden

Hat jemand eine Idee ?

Gruß Alex
 
Hi, kannst Du die Tabellen "Joinen"? Über eine Kundennummer vielleicht? Das müsste schonmal einen schnelleren Ablauf bringen.

Wie sind Deine Tabellen aufgebaut?
 
Tabelle Kauf:

Nr (Zahl)
Betrag (Währung)
Datum (Datum/Uhrzeit)
...

Tabelle Kunde:
Nr (Zahl)
Name (Text)
Vorname (Text)
Ort (Text)
...

Die Nr in Tabelle Kauf und Kunde sind gleich. Es gibt eine eindeutige Nr in Tabelle Kunde, aber es gibt mehrer einträge mit dieser Nr in Tabelle Kauf
Mit einem Join habe ich es noch nicht versucht, da ich keinen Ansatz finde.

Gruß Alex
 
Also, wenn ich das recht verstehe, hast du eine primärschlüssel 'Nr', der jeweils nur einmal in der Tabelle Kunde. Schonmal gut. Dann speicherst Du jeden Vorgang in der Tabelle Kauf ab und läßt Dir dabei die 'Nr' mit abspeichern. Da das ein 1:n Beziehung ist, ist das perfekt, also der Aufbau passt.

Mit Deiner Abfrage möchtest Du heraus Du wissen, welche Kunden haben seit dem 1.05 nicht mehr gekauft.

Müsste also lauten
Code:
SELECT kunde.nr, kunde.name, Max(kauf.datum) AS [Max von datum]
FROM kauf RIGHT JOIN kunde ON kauf.Nr = kunde.nr
GROUP BY kunde.nr, kunde.name
HAVING (((Max(kauf.datum))<#5/1/2007#));

Allerdings findet Deine Abfrage auch DS, von Kunden, die noch gar nicht gekauft haben. Es wäre zu überlegen, ob Du solche Kunden in Deiner DB mitführen möchtest.

Dein zweites Problem sollte hiermit eigentlich auch gelöst sein.
 
Perfekt,

noch eine Frage, wie würde die Abfrage lauten, wenn man nur die Kunden ausgibt, die schon mal eine Rechnung bekommen haben, und zusätzlich die andere Bedingung.
Also wie du schon in deiner Antwort erwähnt hast

Gruß Alex
 
Welche andere Bedingung habe ich erwähnt?

Da Du mit Access zu arbeiten scheinst (Du hast eine mdb), schau Dir doch die Abfrage einfach mal im Entwurfsmodus an, bei Kriterien kannst Du beliebige Bedingungen hinzufügen.
 
Hab die vorherige Antowrt falsch verstanden. Bei der Abfrage die du geschrieben hast sind ja nur die Datensätze drin, die schon mal eine Rechnung hatte.

Merci

Gruß Alex
 
Zurück