query corner
venerdì 24 ottobre 2008Credo che al 99% di voi non capiterà mai di scrivere le query con le quali mi sto intrattenendo, quindi temo che questo post sia soltanto per me. Comunque sia, mentre una query del tipo
INSERT INTO tabella1(attributo1, attributo2, …, attributoN)
SELECT a1, a2, …, an FROM tabella2
ORDER BY a3
ON DUPLICATE KEY UPDATE SET attributo2=tabella2.a2, … attributoN=tabella2.an
funziona perfettamente, se si ha l’esigenza di complicarla leggermente introducendo una join e un ulteriore campo ORDER sulla select, per ottenere qualcosa del tipo
INSERT INTO tabella1(attributo1, attributo2, …, attributoN)
SELECT a1, a2, …, an FROM tabella2 LEFT JOIN tabella3 ON tabella2.riftabella3=tabella3.chiave
ORDER BY a3, tabella3.campo
ON DUPLICATE KEY UPDATE SET attributo2=tabella2.a2, … attributoN=tabella2.an
beh, sappiate che l’ORDER BY aggiuntivo su tabella3.campo manderà in estasi mysql, facendo in modo che l’aggiornamento fatto da ON DUPLICATE KEY sia assolutamente lisergico.
Ho risolto con un cursore, quindi con qualcosa del tipo:
DECLARE var1 varchar(30);
DECLARE var2, var3 double;
[...]
DECLARE done SMALLINT(6) DEFAULT 0;
DECLARE cursore CURSOR FOR SELECT a1, a2, …, an FROM tabella2 LEFT JOIN tabella3 ON tabella2.riftabella3=tabella3.chiave
ORDER BY a3, tabella3.campo;
[...]
set done=0;
OPEN cursore;
WHILE done<>1 DO
FETCH cursore INTO var1, var2, …;
IF done<>1 THEN
INSERT INTO tabella1(attributo1, attributo2, [...])
values(var1, var2, [...])
ON DUPLICATE KEY UPDATE attributo1=var1,
attributo2=var2, [...] ;
END IF;
END WHILE;
CLOSE cursore; SET done=0;
Sapevatelo.