2016-07-28 19 views
0

Ich habe zwei Tabellen: NewParts, storedpartsMS ACCESS SQL Join Subquery

ich die Teile der NewParts einsetzen, die nicht-Jet in den storedparts in die storedparts sind:

SQL_String = "INSERT INTO storedparts " & _ 
      "SELECT newparts.* " & _ 
      "FROM storedparts " & _ 
      "RIGHT JOIN newparts ON (storedparts.identifier = newparts.identifier) AND (storedparts.timeStamp = newparts.timeStamp) " & _ 
      "WHERE ((storedparts.AutoID) Is Null);" 

Dies funktioniert gut bisher. Jetzt wird das Problem: Table storedparts so groß, dass das Programm für den Join-Prozess zu lang wird. Meine Lösung: Vergleichen Sie die neuen Teile nicht mit allen Teilen der gespeicherten Teile, sondern nur mit Teilen, die nicht älter als 4 Tage sind ... Ich habe eine Unterabfrage wie diese versucht, aber ich kann sie nicht ausführen.

SQL_String = "INSERT INTO storedparts " & _ 
      "SELECT newparts.* " & _ 
      "FROM storedparts (WHERE storedparts.timestamp > Now() - 4) " & _ 
      "RIGHT JOIN newparts ON (storedparts.identifier = newparts.identifier) AND (storedparts.timeStamp = newparts.timeStamp) " & _ 
      "WHERE ((storedparts.AutoID) Is Null);" 

Jede Hilfe wird geschätzt.

+2

Warum 'RECHT JOIN'? Wenn Outer Join wirklich benötigt wird, wechseln Sie die Tabellen und machen Sie stattdessen einen 'LEFT JOIN'. Die meisten Leute finden diese schwer genug, um zu verstehen, und rechts verbinden sich viel verwirrender. (Es ist einfacher zu verstehen "Haupttabelle links Join optionale Daten" anstelle von "optionale Daten rechts Join Haupttabelle".) – jarlh

Antwort

0

Dies wäre kein Problem, wenn Ihre Tabellen Indizes haben.

Dann schlage ich vor, Sie ändern Sie Ihre Abfrage zu so etwas wie @jarlh wies darauf hin.

INSERT INTO storedparts 
SELECT newparts.* 
FROM newparts 
LEFT JOIN storedparts 
ON newparts.identifier = storedparts.identifier 
AND newparts.timeStamp = storedparts.timeStamp 
WHERE storedparts.AutoID Is Null; 
0

Sie können die WHERE-Klausel nach den Join-Anweisungen hinzufügen und sehen, ob sie die Leistung der Abfrage verbessert. Sonst Versuchen Sie dies und sehen Sie, ob es funktioniert

SQL_String = "INSERT INTO storedparts " & _ 
      "SELECT newparts.* " & _ 
      "FROM (SELECT * FROM storedparts WHERE 
       storedparts.timestamp > DateAdd ('d', -4, Now()))sparts" & _ 
      "RIGHT JOIN newparts ON (sparts.identifier = newparts.identifier) AND 
      (sparts.timeStamp = newparts.timeStamp) " & _ 
      "WHERE ((sparts.AutoID) Is Null);"