Yuppie! Entrambe funzionano a meraviglia. Grazie.<br>Per la cronaca la seconda è un filino più veloce della prima, ma la differenza è veramente minima. Ho aggiunto un group by c1,c2 ad entrambe per evitare i duplicati (ma questo non l'avevo specificato) visto che questi due diventano poi un indice unique.
<br>A parte il caso particolare, vorrei spiegavi a cosa mi serve, magari per voi è banale:<br>Ho un file da cui leggere dei dati riga per riga per poi inserirli nel database (in t1), il file è ciccioso (2000 righe di media) quando faccio l'inserimento devo verificare che i dati non siano già inseriti. Prima leggevo una riga, verificavo che non ci fosse già il record e se non c'era lo inserivo, altrimenti passavo alla riga dopo. Siccome nel 99% dei casi il record non c'è continuavo a fare interrogazioni per nulla. Quindi ho copiato tutta la struttura della tabella t1 in una tabella temporanea t2 dove inserisco in massa tutte le righe. Ci faccio un bel group by (veloce veloce essendo su una tabella decisamente più piccola) per eliminare i doppioni e con questa query qui faccio una sola interrogazione decisamente più ottimizzata (essendo fatta direttamente dal db) anziché 2000 e concludo con lo svuotamento della t2. Ho ridotto drasticamente il tempo di elaborazione dell'operazione ed il lock sulla tabella. Ora vado a fare una prova dichiarandola delayed che magari guadagno ancora qualcosina ed evito in toto il lock.
<br>Grazie per aver risolto la sega mentale del venerdì. Ora posso andare a sbevazzare felice e contento.<br>Per ritirare la birra vedo se riesco a passare alla riunione di mercoledì. Altrimenti segna che prima o poi si organizza
<br><br><br><div><span class="gmail_quote">Il 12/10/07, <b class="gmail_sendername">Riccardo (SCASI)</b> <<a href="mailto:r.penco@scasinet.com">r.penco@scasinet.com</a>> ha scritto:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Jio ha scritto:<br>> Hergh... è un pò che non mi diletto con le query e la memoria vacilla.<br>> Ho provato a googlare in giro, ma mi sa che non ricordo proprio come<br>> fosse la questione.<br>> Scenario: ho una tabella t1 con i campi: ID, c1, c2, c3 ed una tabella
<br>> t2 con gli stessi campi, ora voglio inserire nella tabella t1 i c1, c2,<br>> c3 della t2 che non hanno campi corrispondenti in c1 e c2.<br>> Per trovare le righe che non corrispondono nelle due tabelle uso:
<br>> SELECT c1, c2, c3, c4 FROM `t2` WHERE (c1,c2) NOT IN (SELECT c1,c2 FROM t1)<br>> che funziona allegramente (so che si può fare anche con un join, ma son<br>> quattro valori in croce e questa la capisco meglio)
<br>><br>> Io avevo buttato giù qualcosa così:<br>> INSER INTO t1 (c1, c2, c3, c4) SELECT c1, c2, c3, c4 FROM t2 WHERE<br>> (c1,c2) NOT IN (SELECT c1,c2 FROM t1)<br>><br>> ma mysql si lamenta.<br>><br>
> Boh! Già è venerdì e non ho voglia, già son con la testa al birrificio<br>> di Lurago stasera, insomma: non mi viene.<br>> Una birra a chi mi trova la soluzione più elegante ;)<br>><br><br>Mi sono venute in mente queste due query.
<br>Non le ho provate e non conosco bene mysql (W PostgreSQL !!), quindi non<br>sono sicuro che funzionino.<br><br>insert into t1 (c1, c2, c3, c4)<br>select t2.c1, t2.c2, t2.c3, t2.c4<br>from t2<br> left outer join t1 on
t2.c1=t1.c1 and t2.c2=t1.c2<br>where <a href="http://t1.ID">t1.ID</a> is null<br><br>oppure<br><br>insert into t1 (c1, c2, c3, c4)<br>select t.c1, t.c2, t.c3, t.c4<br>from (<br> select c1, c2, c3, c4<br> from t2<br> where (c1, c2) not in (
<br> select c1, c2<br> from t1 )<br> ) t<br><br>ciao<br>riki<br><br>--<br>Mailing list info: <a href="http://lists.linux.it/listinfo/gl-como">http://lists.linux.it/listinfo/gl-como</a><br></blockquote></div><br>