2012-06-28 13 views
13

ho queste tabelle e valori:aggiornare più righe utilizzando select

Table1 
------------------------ 
ID | Value 
------------------------ 
2 | asdf 
4 | fdsa 
5 | aaaa 


Table2 
------------------------ 
ID | Value 
------------------------ 
2 | bbbb 
4 | bbbb 
5 | bbbb 

voglio aggiornare tutti i valori in Table2 utilizzando i valori in Tabella 1 con i rispettivi ID di.

C'è un modo per farlo con una semplice query SQL?

+4

possibile duplicato di [SQL Server UPDATE da SELECT] (http://stackoverflow.com/questions/2334712/sql-server -aggiornamento-dalla-selezione) – RedFilter

risposta

33

Eseguire una selezione per assicurarsi che sia quello che si vuole

SELECT t1.value AS NEWVALUEFROMTABLE1,t2.value AS OLDVALUETABLE2,* 
FROM Table2 t2 
INNER JOIN Table1 t1 on t1.ID = t2.ID 

Aggiornamento

UPDATE Table2 
SET Value = t1.Value 
FROM Table2 t2 
INNER JOIN Table1 t1 on t1.ID = t2.ID 

Inoltre, è possibile utilizzare BEGIN TRAN in modo da poter rotolare indietro se necessario, ma assicuratevi di COMMIT che quando sei soddisfatto

6

Se avete gli ID in entrambe le tabelle, le seguenti opere:

update table2 
    set value = (select value from table1 where table1.id = table2.id) 

Forse un approccio migliore è un join:

update table2 
    set value = table1.value 
    from table1 
    where table1.id = table2.id 

Si noti che questa sintassi funziona in SQL Server, ma potrebbe essere diverso in altri database.

1

È possibile utilizzare alias per migliorare la query:

UPDATE t1 
    SET t1.Value = t2.Value 
    FROM table1 AS t1 
     INNER JOIN 
     table2 AS t2 
     ON t1.ID = t2.ID 
0

Ho usato questo su MySQL, MS Access e SQL Server. I campi id sono i campi su cui le tabelle coincidono, non necessariamente l'indice primario.

UPDATE DestTable INNER JOIN SourceTable ON DestTable.idField = SourceTable.idField SET DestTable.Field1 = SourceTable.Field1, DestTable.Field2 = SourceTable.Field2... 
0
SET SQL_SAFE_UPDATES = 0; 
UPDATE m1,m2 
SET m1.code = m2.code 
WHERE 
    m1.name = (select distinct m2.name from m2 limit 1); 

Qui, updation sta prendendo diavolo in m1.code, dove condtion sta cercando tutti i record in sub query e restituire tutte le rows.I corrispondenti usano limite 1 per tornare uno invece di duplicati. È possibile utilizzare distinto o limite 1 o superiore 1 o conteggio Sry, per il mio inglese

+1

Si prega di aggiungere qualche descrizione per il codice. @ HariKishore –

+1

Grazie per questo snippet di codice, che potrebbe fornire un aiuto immediato. Una spiegazione appropriata [migliorerebbe notevolmente] (// meta.stackexchange.com/q/114762) il suo valore educativo mostrando * perché * questa è una buona soluzione al problema e renderebbe più utile ai futuri lettori con simili, ma non identiche, domande. Si prega di [modificare] la risposta per aggiungere una spiegazione e fornire un'indicazione di quali limitazioni e ipotesi si applicano. –

Problemi correlati