A geek's diary

blobg

Credo 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.

7 commenti a “query corner”

  1. Anonimo scrive:

    effettivamente son tragedie da cui un potrebbe anche non riprendersi più

    però tra qualche ora potrei smentire ciò che ho detto in precedenza

    sapevatelo

  2. iko scrive:

    cmq, deve essere la giornata delle sfighe informatiche, qui dalle mie parti si è piantato l’impiantabile.. e ci sono ancora dietro a lavorare :mad:

  3. Skop scrive:

    Non mi vorrei sbagliare, ma nel caso di JOIN dovresti usare GROUP BY invece di ORDER BY… se non erro…

  4. marco scrive:

    group by e order by sono 2 funzioni completamente diverse…

    cmq lo scazzo del buttha è tutta colpa del motore di report che usiamo che non consente di chiamare 2 subreport sulla stessa riga

  5. Skop scrive:

    Infatti erravo. Chiedo venia, ricordavo un caso che pareva simile ma non lo ero. L’età avanza e la lucidità scema :mrgreen:

Trackbacks/Pingbacks

Scrivi un commento