2012-02-20 8 views
10

con MySQL sto usando questa query:MYSQL UPDATE SET sulla stessa colonna, ma con più clausole Where

UPDATE CustomerDetails_COPY 
SET Category_ID = 10 
WHERE Category_ID = 2 

Questo è bene, ma mi piacerebbe annuncio 15+ più SET/WHERE ad esso piace:

UPDATE CustomerDetails_COPY 
SET Category_ID = 9 WHERE Category_ID = 3 
SET Category_ID = 12 WHERE Category_ID = 4 
SET Category_ID = 11 WHERE Category_ID = 5 
..... 

Come aggiungerei a questo?

EDIT:

come da Hunters Suggerimento:

UPDATE CustomerDetails_COPY 
    SET Category_ID = CASE Category_ID 
     WHEN 2 THEN 10 
     WHEN 3 THEN 9 
     WHEN 4 THEN 12 
     WHEN 5 THEN 11 
    END 
WHERE Category_ID IN (2,3,4,5) 

Questa grande opera! Grazie

risposta

13

Qualcosa del genere dovrebbe funzionare per voi:

UPDATE CustomerDetails_COPY 
    SET Category_ID = CASE Category_ID 
     WHEN 2 THEN 10 
     WHEN 3 THEN 9 
     WHEN 4 THEN 12 
     WHEN 5 THEN 11 
    END 
WHERE Category_ID IN (2,3,4,5) 

In alternativa, come suggerito Simon, si potrebbe fare questo per salvare l'ingresso dei valori due volte:

UPDATE CustomerDetails_COPY 
    SET Category_ID = CASE Category_ID 
     WHEN 2 THEN 10 
     WHEN 3 THEN 9 
     WHEN 4 THEN 12 
     WHEN 5 THEN 11 
     ELSE Category_ID 
    END 

Fonte: http://www.karlrixon.co.uk/writing/update-multiple-rows-with-different-values-and-a-single-sql-query/

+1

Eliminato il mio commento come provato e funzionato, bello :) Come nota, è possibile aggiungere "ELSE ID_Categoria" prima di "FINE" se non si desidera includere il WHERE –

+0

Grazie. Un buon punto; salverebbe dall'entrare nelle colonne due volte. –

+2

Con la clausola 'WHERE', sei praticamente sicuro di poter utilizzare un indice su Category_ID, anche con [safe-updates] (http://dev.mysql.com/doc/refman/5.0/en/ mysql-command-options.html # option_mysql_safe-updates) abilitato, è necessario inserire una clausola 'WHERE' con un' UPDATE', quindi la clausola 'ELSE' potrebbe non essere la scelta migliore. Rimani con "DOVE". –

2

Il modo tipico per farlo sarebbe

UPDATE CustomerDetails_COPY SET Category_ID = 10 WHERE Category_ID = 2 
UPDATE CustomerDetails_COPY SET Category_ID = 9 WHERE Category_ID = 3 
UPDATE CustomerDetails_COPY SET Category_ID = 12 WHERE Category_ID = 4 
UPDATE CustomerDetails_COPY SET Category_ID = 11 WHERE Category_ID = 5 

C'è qualche motivo si sta evitando questo approccio?

C'è qualche correlazione tra i valori vecchi e nuovi di ID_categoria?

+0

Ho più di 300 tipi diversi :( – Monty

+0

Perché questo cambia qualcosa? Questa è una query una tantum, giusto? Quindi usa la funzionalità di copia/incolla del tuo computer e prendine un giorno. A meno che, naturalmente, il NUOVO valore di uno qualsiasi di questi sia in conflitto con il valore OLD di alcuni. Quindi potresti aver bisogno di un tavolo temporaneo o della soluzione di Hunter – JohnFx

+0

La maggior parte sono diversi ma alcuni sono uguali. – Monty

1

potresti creare un'altra tabella dove viene effettuata la mappatura .. come:

map_table 
----------- 
mani_id 
new_id 

poi compilarlo ...

poi

UPDATE CustomerDetails_Copy set category_id = (select new_id from map_table where mani_id = category_id) 
Problemi correlati