SQL Probleme mit einem Update über zwei Tabellen hinweg

KaeTuuN

Rear Admiral
Registriert
Okt. 2002
Beiträge
5.305
Hallo zusammen,

ich möchte einen Update Befehl ausführen und bekomme es einfach nicht gebacken...
Situation:
Tabelle a: a.ID(pk), a.Vorname, a.Nachname, b.Status
Tabelle b: b.ID(pk), b.PLZ, b.Strasse, b.Hausnummer
Verknüpft werden beide durch die jeweilige ID.

Was soll gemacht werden?
Alle aus Tabelle a, die in Tabelle b die PLZ 12345 haben sollen den Status 42 erhalten.

Wie ich die Datensätze mit einem "Select" bekomme weiß ich, aber wie ich da jetzt ein "Update" drauß mache weiß ich leider nicht. :/
Das ganze als Select:
Code:
SELECT a.ID, b.PLZ
FROM a
JOIN b
ON a.ID = b.ID
WHERE b.Status = 42

Mein Versuch mit Update:
Code:
UPDATE a
SET Status = 42
WHERE a.ID IN
(SELECT a.ID, b.PLZ
FROM a
JOIN b
ON a.ID = b.ID
WHERE b.Status = 42)

Hoffe ihr versteht, was ich meine und könnt mir helfen.

Mfg Kae
 
Hi Kae,

das Update Statement hat einen Fehler. Du fragst where a.ID in einer Liste mit mehreren Spalten. Bei Abfragen mit IN darf das Subselect jedoch nur eine Spalte auswerfen (vom selben Datentyp)

Lösche einfach das ", b.PLZ" aus dem Select statement und das ganze sollte funktionieren.


**EDIT**
Da ich sehe, dass du sowieso noch auf a.ID = b.ID abfragst, macht es auch keinen Sinn, dass du den Select überhaupt über 2 Tabellen machst. Du könntest auch direkt Select b.ID... machen ohne die Tabelle a zu verwenden.

Außerdem hoffe ich ja mal, dass a und b als Tabellennamen nur verfremdet sind. Eine solche Datenbank möchte niemand analysieren, wenn die Tabellen wirklich so heißen.
 
Zuletzt bearbeitet: (Optimierung)
Code:
UPDATE a
SET Status = 42
FROM a
INNER JOIN b
ON a.ID = b.ID
WHERE b.PLZ = 12345
 
Tabellen- und Spaltennamen sind hier rein fiktiv. Im Original haben beide Tabellen über 30 Spalten und mehrere 10.000 Einträge
Hab ein wenig gebraucht um zu verstehen, was du mir sagen willst, aber jetzt habe ich es verstanden, funktioniert wunderbar, vielen Dank! :)

Mfg Kae
 

Ähnliche Themen

Zurück
Oben