2016-01-25 6 views
7

ho le seguenti due tabelle:SQL: tavolo Aggiornamento di mappatura due colonne a vicenda

 Table A 
+-------------------+ 
|___User___|__Value_| 
| 3  | a  | 
| 4  | b  | 
| 5  | c  | 
|____6_____|__d_____| 



     Table B 
+-------------------+ 
|___User___|__Value_| 
| 1  |  | 
| 4  |  | 
| 5  |  | 
|____9_____|________| 

Il mio compito è quello di prendere user dalla Tabella A (e le loro correspondings value) e poi mappare alla tabella B e inserisci quei valori lì dentro. Così dall'esempio precedente tabella B dovrebbe essere simile a questo dopo l'esecuzione dello script:

 Table B 
+-------------------+ 
|___User___|__Value_| 
| 1  |  | 
| 4  | b  | 
| 5  | c  | 
|____9_____|________| 

La mia domanda è come posso costruire una query SQL che farà questo per me in modo efficiente, se la tabella A contiene 300.000 + le voci e la tabella B contiene 70.000 voci?

NOTE: In tabella A campo User non è unico e nessuno dei due è il campo Value. Tuttavia nella Tabella B, entrambi i campi User e Value sono unici e non dovrebbero apparire più di una volta. Né sono le chiavi primarie per entrambe le tabelle.

+3

Quindi se si hanno 2 valori in un corrispondente con 1 utente in b quale di questi valori deve essere utilizzato per l'aggiornamento? – Mihai

+2

Se c'è più di una riga per lo stesso 'utente' nella Tabella A, quale' valore' della riga deve essere copiato in B? –

+0

Buona domanda @AlanHadsell - non importa quale riga viene copiata: può essere la prima occorrenza o l'ultima di tutto ciò che è nella colonna 'valore' per la Tabella A – user1775598

risposta

7

potrebbe essere questo

update table_b as b 
inner join table_a as a on a.User = b.User 
set b.value = a.value 
0

La tua domanda non è chiara su cosa fare circa i valori che sono già in b. Se si utilizza un left join, allora questi saranno esplicitamente essere impostati su NULL:

update table_b b left join 
     table_a a 
     on a.User = b.User 
    set b.value = a.value; 

Se si desidera mantenere i valori esistenti per i non-match, quindi utilizzare inner join.

Si noti che questo potrebbe essere inefficiente, ma dovrebbe essere ok se esiste un indice su a(user).

Se si dispone di pochissimi utenti nello a e di molti e molti duplicati, è possibile aggregare a prima di partecipare.

+0

Grazie per la risposta dettagliata. Ci sono circa 50k utenti e sì molti duplicati (300K righe in totale). Non ci sono indici attualmente su nessuna tabella.Sarei in grado di aggiungere un indice a quelle tabelle o sarebbe qualcosa che avrei dovuto fare quando la tabella è stata creata? Inoltre cosa intendi per tabella di aggregazione a? – user1775598

+0

L'indice migliore per la sua tabella è su 'table_a (user, value)'. –

1

In situazioni del mondo reale, è più probabile che si desideri un valore prevedibile, ad esempio il massimo value per qualsiasi dato user. In tal caso, si desidera

update table_b as b 
inner join (
    select user, max(value) from table_a 
    group by user) as a_max on a.user = b.user 
set b.value = a_max.value