Ho una tabella in MySQL:come MySQL tabella di aggiornamento autonomo lavoro
CREATE TABLE test.tem(a INT,b INT);
Con seguito di dati:
INSERT INTO test.tem VALUES(1,2),(1,1),(1,NULL),(2,3);
Ora i dati dovrebbero essere:
+------+------+
| a | b |
+------+------+
| 1 | 2 |
| 1 | 1 |
| 1 | NULL |
| 2 | 3 |
+------+------+
voglio aggiornare la colonna b al gruppo min (b) per colonna a.
Così lo SQL dovrebbe essere:
UPDATE test.tem o
SET o.b = (SELECT
MIN(b)
FROM test.tem i
WHERE i.a = o.a)
Ma MYSQL Impossibile specificare tabella di destinazione per l'aggiornamento nella clausola FROM
Quindi penso che al di sotto di SQL può risolvere il mio problema con buone prestazioni:
UPDATE test.tem t1
JOIN test.tem t2
ON t1.a = t2.a
SET t1.b = t2.b
WHERE t1.b IS NULL
OR t1.b > t2.b;
Ma il risultato è:
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
+------+------+
In realtà il risultato quello che serve è:
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
| 2 | 3 |
+------+------+
Domanda 1: Perché MYSQL funzionato il risultato non corretto con l'SQL? Quale dovrebbe essere l'SQL corretto con una buona efficienza?
Domanda 2: quale dovrebbe essere l'SQL se voglio solo aggiornare b con valore NULL (aggiornare solo il terzo record)?
Circa la domanda di 2, ho cercato di usare lo SQL non corretta di seguito:
UPDATE test.tem t1
JOIN test.tem t2
ON t1.a = t2.a
AND t1.b IS NULL
SET t1.b = t2.b
WHERE t1.b IS NULL
OR t1.b > t2.b;
ci vogliono circa 5 minuti per aggiornare in una tabella con 4,5 milioni di record utilizzando SQL. Potete aiutarmi a scoprire la colpa del mio SQL? – bluearrow
@bluearrow Poiché questo è un argomento diverso, dovresti fare un'altra domanda, fornendo la struttura della tabella (incluso l'indice), la richiesta e il suo [piano di query] (http://dev.mysql.com/doc/refman /4.1/en/execution-plan-information.html). –
Guarda la tua risposta: http://stackoverflow.com/questions/18117717/mysql-join-update-internal-steps – bluearrow