Könnt ihr mir bitte mal erklären, was ihr da treibt?
Ich sehe dazwei Statements, das erste liefert ein Mengenergebnis, das zweite macht einen Mengen-Update. Ich bin mit IBM DB2 und MS SQL Server groß geworden, bei den beiden wäre es mir zumindest mal neu, dass
- ein SELECT col AS name automatisch eine Variable anlegt (dafür braucht es DECLARE und vor allem eine Procedure bzw. Function). Mit
AS name
definiert man lediglich einen Column-Name für berechnete Ergebnisspalten. - diese Variable auch noch eine TABLE sein kann - das wäre in eurem Beispiel nötig, um alle Treffer aus dem SELECT in den UPDATE mitzunehmen
- diese Table, die in der Variablen steht, 1:1 in einem Update-Statement für einen Mengen-Update verwendet werden kann (dazu müsste per WHERE eine Korrelation hergestellt werden).
Aber ich könnte ja auch keine Ahnung von MySQL haben (hab ich bestimmt auch nicht). Also habe ich es ausprobiert (mit MySQL 5.6). Wie erwartet sagt mir der Update, dass er gemeindeschluessel
nicht kennt. Entweder habe ich was übersehen (also WIRKLICH keine Ahnung), oder ihr philosophiert da über merkwürdige Dinge.
Meine Antwort wäre diese gewesen:
Um ein Feld in Tabelle A basierend auf Daten aus Tabelle B zu updaten, brauche ich eine SELECT Query, die mir aus einem Satz in Tabelle A eindeutig einen Satz in Tabelle B liefert. Wenn meine Zielspalte nullable ist, brauche ich weiter nichts zu tun. Ist sie es nicht, muss ich noch einen COALESCE drumherum setzen um einen Default zu haben.
UPDATE tabelle1 a
SET ok = 5,
ort_schluessel = (SELECT ortschafts_kennziffer
FROM tabelle2 b
WHERE a.gemeindeschluessel = b.gemeinde_kennziffer
AND a.ort = b.ortschaftsname)
WHERE ok = 4
Dieses Statement setzt voraus, dass der WHERE für tabelle2 maximal eine Row selektiert, andernfalls gibt's einen SQL Fehler.
Rolf