Ich habe bisher ( leider recht oft ) Updates verwendet, die mit Hilfe eines JOINS eine Tabelle unter Berücksichtigung ALLER Zeile einer anderen ( auch mehrfach ) aktualisiert haben.
Folgendes Beispiel
CREATE TEMPORARY TABLE tmpDst
( Id SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Txt TEXT NOT NULL );
CREATE TEMPORARY TABLE tmpSrc
( PId SMALLINT NOT NULL,
Nr SMALLINT NOT NULL,
Str Text NOT NULL );
INSERT INTO tmpDst
( Id, Txt )
VALUES
( 1, '' ),
( 2, '' );
INSERT INTO tmpSrc
( PId, Nr, Str )
VALUES
( 1, 1, 'Eins' ),
( 2, 2, 'Zwei' ),
( 1, 3, 'Drei' ),
( 2, 4, 'Vier' ),
( 1, 5, 'Fünf' );
Und nu kommts:
UPDATE tmpDst as d
CROSS JOIN tmpSrc as s
ON s.PId = d.Id
SET d.Txt = CONCAT( d.Txt, s.Str )
WHERE 1;
SELECT * FROM tmpDst;
hat demnach folgendes Ergebnis geliefert:
Id Txt
--------
1 EinsDreiFünf
2 ZweiVier
Seit MySql 5.0.12 verweist MySql in einem Nebensatz Ihrer Ref. nun darauf, dass das nicht sql2003 konform ist und die entsprechenden Abfragen umgeschrieben werden müssen.
Ergebnis ab 5.0.12:
1 Eins
2 Zwei
fertig, toll
Gibt's eine Möglichkeit, den verblödeten Optimizer davon abzuhalten, die restlichen Zeile außen vor zu lassen?
Hat da schon Jemand eine Lösung?