SQL: UPDATE mehrerer Spalten und Zeilen

Jetzt habe ich wirklich mal eine schwere Frage! (zumindest für mich zu schwer)

Ich habe eine Tabelle „A“ in der werden Daten anhand einer „ID“ und einem „Datum“ identifiziert. Außerdem gibt es noch einen Integer-Wert „Wert“
Es gibt eine Tabelle „B“ in der alle zusammengefasst und ausgewertet werden sollen.
Jetzt sollen (zum beispiel wöchentlich) die Daten aus „A“ in „B“ übernommen werden. Ich wollte ein SQL-Update schreiben, in dem ich die „ID“ und das „Datum“ in „A“ und „B“ vergleiche und den Wert aus „A“ in „B“ übernehme.
Könnte es etwa so anfangen(?):

UPDATE B SET Wert=(SELECT Wert FROM A)
WHERE B.ID=A.ID AND B.Datum=A.Datum;

Problem: Im „WHERE“-Statement kann ich nicht auf „A“ zugreifen.
Wie löse ich dieses Problem?

Ich habe eine Tabelle „A“ in der werden Daten anhand einer
„ID“ und einem „Datum“ identifiziert. Außerdem gibt es noch
einen Integer-Wert „Wert“
Es gibt eine Tabelle „B“ in der alle zusammengefasst und
ausgewertet werden sollen.
Jetzt sollen (zum beispiel wöchentlich) die Daten aus „A“ in
„B“ übernommen werden. Ich wollte ein SQL-Update schreiben, in
dem ich die „ID“ und das „Datum“ in „A“ und „B“ vergleiche und
den Wert aus „A“ in „B“ übernehme.
Könnte es etwa so anfangen(?):

UPDATE B SET Wert=(SELECT Wert FROM A)
WHERE B.ID=A.ID AND B.Datum=A.Datum;

Das SQl-Statement muss so lauten:

UPDATE B SET WERT = (SELECT WERT FROM A WHERE B.ID = A.ID AND B.D
ATUM = A.DATUM);

Also eigentlich hast du nur die schließende Klammer falsch gesetzt …

Dieses Statement aktualisiert allerdings nur Werte in B, die in A geändert wurden. Wenn in A neue Datensätze dazugekommen sind oder gar gelöscht wurden, wird das in B nicht berücksichtigt!

Servus
Roland
(SQL-Amateur)

[…]
Könnte es etwa so anfangen(?):

UPDATE B SET Wert=(SELECT Wert FROM A)
WHERE B.ID=A.ID AND B.Datum=A.Datum;

Das SQl-Statement muss so lauten:

UPDATE B SET WERT = (SELECT WERT FROM A WHERE B.ID = A.ID AND
B.D
ATUM = A.DATUM);

Also eigentlich hast du nur die schließende Klammer falsch
gesetzt …

Dieses Statement aktualisiert allerdings nur Werte in B, die
in A geändert wurden. Wenn in A neue Datensätze dazugekommen
sind oder gar gelöscht wurden, wird das in B nicht
berücksichtigt!

Servus
Roland
(SQL-Amateur)

Das ist schon recht gut und verständlich. Ich arbeite aber in MS Access 2000 und der gibt folgende Fehlermeldung:
„Sie haben eine Unterabfrage gestellt, die mehr als ein Feld zurückgeben kann, ohne das reservierte Wort EXISTS im FROM Abschnitt der Hauptabfrage zu verwenden. Überarbeiten Sie die Unterabfrage, damit nur ein Feld abgerufen wird.“
Wo muss ich das denn jetzt noch einbauen? Meine bisherigen Versuche sind alle gescheitert.

HELP?!?

Hi,

UPDATE B SET Wert=(SELECT Wert FROM A)
WHERE B.ID=A.ID AND B.Datum=A.Datum;

Du willst alle Werte der B-Tabelle mit dem entsprechenden Wert der A-Tabelle überschreiben, und zwar heißt „entsprechend“, daß beide IDs gleich und das Datumsfeld gleich ist - habe ich Recht?

Das SQl-Statement muss so lauten:

UPDATE B SET WERT = (SELECT WERT FROM A WHERE B.ID = A.ID AND
B.D
ATUM = A.DATUM);

Das wäre ganz schlecht, wenn das ginge. Denn in der Oberabfrage hast Du keine WHERE-Klausel, also würdest Du sämtliche Werte mit einem Wert überschreiben. Glücklicherweise geht das nicht.

Das ist schon recht gut und verständlich. Ich arbeite aber in
MS Access 2000 und der gibt folgende Fehlermeldung:
„Sie haben eine Unterabfrage gestellt, die mehr als ein
Feld zurückgeben kann, ohne das reservierte Wort EXISTS im
FROM Abschnitt der Hauptabfrage zu verwenden. Überarbeiten Sie
die Unterabfrage, damit nur ein Feld abgerufen wird.“

Das ist der Grund, warum das nicht geht: Deine Unterabfrage müßte genau einen Wert je Zeile liefern, aber so formuliert kann sie das nicht garantieren.

Wo muss ich das denn jetzt noch einbauen? Meine bisherigen
Versuche sind alle gescheitert.

So dürfte das gehen:

UPDATE A,B 
 SET B.WERT = A.WERT
 WHERE B.ID=A.ID 
 AND B.Datum=A.Datum;

Gruß

J.

So dürfte das gehen:

UPDATE A,B
SET B.WERT = A.WERT
WHERE B.ID=A.ID
AND B.Datum=A.Datum;

Gruß

J.

Genial! Das funktioniert ja sogar!
Danke José!