2017-05-03 5 views
2

Ich mache ein kleines Projekt für die Schule ist SQL. Ich verwende MS Access als meine Datenbank-Engine.Update-Abfrage mit Select-und Where-Klausel

Ich versuche, Projektphasen mit dem realen Enddatum einer Phase bis zum letzten realen Enddatum einer Zuweisung in dieser Phase zu berechnen und zu aktualisieren. Diese Abfrage gibt mir eine Aufforderung zurück, die mich auffordert, einen Wert für "meet.PhaseId" einzugeben.

UPDATE ProjectPhases 
SET RealEndDate = (SELECT MAX(asgn.RealEndDate) AS RealEndDate 
        FROM Assignments AS asgn 
        INNER JOIN 
        (
        Meetings AS meet 
        INNER JOIN ProjectPhases 
        ON meet.PhaseId = ProjectPhases.PhaseId 
        ) 
        ON asgn.MeetingId = meet.MeetingId 
        WHERE meet.PhaseId = ProjectPhases.PhaseId 
        vAND asgn.RealEndDate IS NOT NULL) 
WHERE meet.PhaseId = ProjectPhases.PhaseId; 

Database structure (image)

+1

"nicht funktioniert" ist keine Art von Beschreibung, die Ihnen helfen wird, wertvolle Antworten zu erhalten. Versuchen Sie in Ihrer Problembeschreibung genauer zu sein. – Plirkee

+0

@Plirkee Tnx, ich bin neu hier. meine Frage bearbeitet. –

Antwort

2

Sie sollten Ihre Aggregatabfrage in einer separaten Abfrage speichern und dann das Domänenaggregat DLookUp() in der Aktualisierungsabfrage verwenden. In MS Access SQL müssen Aktualisierungsabfragen (im Gegensatz zu anderen Dialekten) die aktualisierbare-Bedingung (oder nicht read-only) beibehalten, die die Verwendung von Aggregatabfragen ausschließt.

SELECT-Abfrage(keine ProjectPhases beitreten)

SELECT meet.PhaseId, MAX(asgn.RealEndDate) AS MaxRealEndDate 
FROM Assignments AS asgn 
INNER JOIN Meetings AS meet 
ON asgn.MeetingId = meet.MeetingId 
WHERE asgn.RealEndDate IS NOT NULL 
GROUP BY meet.PhaseId 

UPDATE Abfrage

UPDATE ProjectPhases p 
SET p.RealEndDate = DLookUp("MaxRealEndDate", "myaggQuery", "PhaseId=" & p.PhaseId) 

Alternativ können Sie eine verschachtelte Domäne Aggregat betrachten die gespeicherte Aggregat zu vermeiden Abfrage:

UPDATE ProjectPhases p 
SET p.RealEndDate = DMax("RealEndDate", "Assignments", "MeetingId=" & 
         DLookUp("MeetingId", "Meetings", "PhaseId=" & p.PhaseId) & 
         " AND RealEndDate IS NOT NULL") 
+0

Also ist es nicht möglich, diese Sache in pure sql zu tun, wenn Sie MS Access verwenden? –

+0

Wie bereits erwähnt, können nicht aktualisierbare Abfragen, die Aggregatabfragen enthalten, in Aktualisierungsabfragen im MS Access SQL-Dialekt nicht verwendet werden. Jetzt können Sie eine Tabelle mit Aggregat-Abfrageergebnissen erstellen und dann ein 'UPDATE tbl INNER JOIN othertbls ... SET 'verwenden, da dieser Join aktualisierbar ist und' GROUP BY 'nicht enthält. – Parfait

0

Sie wählen Sie nicht meet.PhaseId aus Ihrer Unterabfrage, also keine PhaseId nach dem gefiltert werden existiert.

Es ist oft einfacher, Ihre Abfrage Schritt für Schritt mit dem GUI-Designer aufzubauen.

+0

Wenn ich PhaseId zur Unterabfrage hinzufüge, bekomme ich "Sie haben eine Unterabfrage geschrieben, die mehr als ein Feld zurückgeben kann, ohne das reservierte Wort EXISTS in der FROM-Klausel der Hauptabfrage zu verwenden. Überarbeiten Sie die SELECT-Anweisung der Unterabfrage, um nur ein Feld anzufordern. Fehler 3306) " Ich kann die GUI nicht verwenden, das Pint hier ist zu lernen, SQL –

+0

Ihre Fehler und Fragen sind sehr einfach, so verwenden Sie den GUI-Designer und studieren Sie die SQL. Und/oder suchen Sie nach einem Leitfaden für SQL. – Gustav