MYSQL Update-Befehl auf Basis Erg. SELECT Abfrage?

Claus Lehmann

Angesehenes Mitglied
Wenn ich einen Update auf Felder x,y einer Tabelle A machen will aber nur für solche Datensätze die sich aus einem SELECT Join der Tabellen A und B mit Bedingungen ergeben ist, das dann z.B.

UPDATE A SET x='1', y='3' WHERE
(
SELECT x, y, SUM( z ) ,
FROM A , B
WHERE x = w
AND r=1
GROUP BY x
HAVING y > SUM( z )
)

Oder funktioniert so eine "Verschachtelung" nicht, weil innen wie außen die gleichen Tabellen betroffen sind? wenn nicht, wie löse ich das alternativ?

Danke.
 
Das wird imho bisher von MySQL in keiner Version unterstützt. Das Handbuch sagt dies auch aus.

Mögliche Alternative: speichere das Ergebnis des selects in einer SQL-Variable und nutze diese im Update-Statement (fand ich vor einiger Zeit in einem englischsprachigen Forum).
 
Das gilt immer noch so:

QUOTE [...]
Im Allgemeinen können Sie eine Tabelle nicht in einer Unterabfrage modifizieren und zugleich mit einem Select abfragen. Diese Beschränkung gilt beispielsweise für Anweisungen der folgenden Form:

CODE DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);


Ausnahme: Das obige Verbot gilt nicht, wenn Sie eine Unterabfrage für die modifizierte Tabelle in der FROM-Klausel verwenden. Beispiel:

CODE UPDATE t ... WHERE col = (SELECT (SELECT ... FROM t...) AS _t ...);

[...]

Quelle: MySQL 5.1 Referenzhandbuch - I.3. Beschränkungen von Unterabfragen


 
Das geht mit mySQL nicht? Ich nutze ja das Teil nicht.

Beim MS-SqlServer (auch innerhalb von Access, da mit einer leicht anderen Syntax) geht so etwas:

CODE Update Personen
Set Eigenschaft = 1
From Personen As A Inner Join Firmen As B
On A.FirmenId = B.FirmenId
Where (B.FirmentypenId & 2) = 2


würde bsp. alle Personen aktualisieren, die zu einer Firma mit Bit-Typ 2 gehören.


Analog ist es eine wunderbare Möglichkeit, Testdaten zu erzeugen, indem man vorhandene Daten in dieselbe Tabelle einfügt und irgendeine Eigenschaft modifiziert.
 
Hab das Problem jetzt umgegangen durch ein kleines PHP Script.
welches erst den SELECT macht und dann die einzelnen Ergebnisdatensätze durchgeht und den UPDATE macht.
Zwar sicher nicht die eleganteste Lösung erfüllt aber den Zweck ohne dass ich lange rumprobieren muss.
 
Zurück
Oben