2016-05-09 2 views
0

Zum ersten Mal bitte verzeihen Sie meine Neuigkeit! In MS Access 2013, Wie kann ich die 'LatestRequest'-Spalte der Actions-Tabelle mit der' id 'aus der IncomingRequests-Tabelle aktualisieren, indem nur das neueste RequestDate für jede Scan-Ergebnis-ID verwendet wird?MS Access 2013 - Wie führe ich ein SQL-Update mit ID basierend auf MAX-Datum von einer anderen Tabelle aus?

Beachten Sie, dass in IncomingRequests doppelte Scanergebnis-IDs vorkommen können, das Datum jedoch immer unterschiedlich sein wird.

Aktionen Tabelle:

id (primary key) | Scan Result ID | LatestRequest | other-misc-columns... 
1    | 123456   | (blank) 
2    | 666666   | (blank) 
3    | 789789   | (blank) 
4    | 888888   | (blank) (this record won't change) 
5    | 999222   | 987  (this record won't change) 

IncomingRequests Tabelle:

id (primary key) | RequestDate | Scan Result ID | other-misc-columns... 
201    | 5/9/2016 | 123456    
202    | 4/12/2016 | 123456    
203    | 5/7/2016 | 666666 
204    | 5/8/2016 | 666666 
205    | 5/9/2016 | 789789 

Was ich sehen will:

Aktion Tabelle:

id (primary key) | Scan Result ID | LatestRequest | other-misc-columns... 
1    | 123456   | 201 
2    | 666666   | 204 
3    | 789789   | 205 
4    | 888888   | (blank) 
5    | 999222   | 987 

Ich habe versucht, eine zu schaffen Unterabfrage für th Das maximale Datum und das Aktualisieren der Tabelle "Aktionen", jedoch unter "Vorgang muss eine aktualisierbare Abfrage verwenden" ausgeführt werden.

UPDATE Actions INNER JOIN (SELECT t1.* 
FROM 
    IncomingRequests t1 
    INNER JOIN 
    (
     SELECT [Scan Result ID], MAX([DateFromIT]) AS MaxDate 
     FROM IncomingRequests 
     GROUP BY [Scan Result ID] 
    ) t2 
     ON t1.[Scan Result ID]=t2.[Scan Result ID] 
      AND t1.[RequestDate]=t2.MaxDate 
) AS ij ON Actions.[Scan Result ID] = ij.[Scan Result ID] 
SET LatestRequest = ij.id 

Die alternative Version Ich habe (siehe unten) prüft die Anfrage Tabelle Primärschlüssel-ID verwenden, und dies funktioniert, außer, dass ich es nach neuestem Datum wirklich nicht höchste ID.

UPDATE Actions 
INNER JOIN IncomingRequests ON Actions.[Scan Result ID] = IncomingRequests.[Scan Result ID] 
SET Actions.latestrequest = IncomingRequests.id 
WHERE IncomingRequests.id= 
(SELECT MAX(IncomingRequests.id) 
FROM IncomingRequests 
WHERE Actions.[Scan Result ID] = IncomingRequests.[Scan Result ID] 
GROUP BY IncomingRequests.[Scan Result ID]); 

Ich habe lief in viele Sackgassen versuchen, andere Antworten von dieser Seite zu folgen, oder Fehler in MS Access, die andere nicht zu bekommen schien. Jede Hilfe wird geschätzt.

Vielen Dank! =)

Antwort

0

gelöst schließlich gelöst I durch ein Sub-Modul in VBA Erstellung folgendes zu tun:

  • DROP eine temporäre Tabelle.
  • Führen Sie eine SELECT mit dem MAX-Datum in eine temporäre Tabelle aus.
  • Führen Sie ein UPDATE mit einem INNEREN JOIN zur Temp-Tabelle durch.
  • DROP die Temp-Tabelle.

Hässlich, aber es ist der einzige Weg, wie ich es zur Arbeit bringen konnte.

0

die Sie interessieren und lassen Sie mich wissen, ob dies Ihr Problem

update Actions set Actions.LatestRequest = t2.id 
from Actions 
inner join (select id,ScanResultID from IncomingRequests where RequestDate 
in (select MAX(RequestDate) from IncomingRequests group by ScanResultID)) 
t2 on Actions.ScanResultID = t2.ScanResultID 
+0

Danke für die Aussage. Ich habe den Fehler 'Ungültige SQL-Anweisung' erhalten - er erwartet delete/insert/procedure/select/update. Laut http://stackoverflow.com/questions/24970777/how-doi-i-use-the-with-statement-in-access Access unterstützt diese Anweisung –

+0

@AndyJ bitte nicht die bearbeitete Antwort. – Sam

+0

Danke für die bearbeitete Antwort. Leider gab es einen "Syntaxfehler (fehlender Operator) im Abfrageausdruck" t2.id von Ac ..... etc ' \t Ich entfernte die' aus Aktionen 'Zeile und legte die' set Actions.LatestRequest = t2.id ' Nach der letzten Zeile, und das schien zumindest syntaktisch korrekt zu sein. Die innerste SELECT MAX() -Anweisung disassoziiert jedoch die Daten von den IDs, und es gibt doppelte Daten. Daher hat die äußere SELECT-Anweisung nur Daten, mit denen sie arbeiten kann, und die Abfrage tut nicht, was sie tun soll. –

Verwandte Themen