2012-06-28 39 views
13

que tienen estas tablas y valores:Actualizar varias filas utilizando instrucción de selección

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


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

Quiero actualizar todos los valores en la Tabla 2 utilizando los valores en la Tabla 1 con sus respectivas identificaciones.

¿Hay alguna manera de hacerlo con una simple consulta SQL?

+4

posible duplicado de [SQL Server UPDATE from SELECT] (http://stackoverflow.com/questions/2334712/sql-server) -update-from-select) – RedFilter

Respuesta

33

Ejecutar una selección para asegurarse de que es lo que quiere

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

actualización

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

También, considere el uso de BEGIN TRAN para que pueda rodar de nuevo si es necesario, pero asegúrese de que COMMIT se cuando estás satisfecho

6

Si tiene ID en ambas tablas, las siguientes obras:

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

Tal vez un mejor enfoque es una combinación:

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

Tenga en cuenta que esta sintaxis funciona en SQL Server, pero puede ser diferente en otras bases de datos.

1

Puede utilizar alias para mejorar la consulta:

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

he utilizado éste en MySQL, MS Access y SQL Server. Los campos id son los campos sobre los cuales coinciden las tablas, no necesariamente el índice 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); 

Aquí, updation está tomando juntan en m1.code, donde el condtion está buscando todos los registros de consulta sub y devolver todos los rows.I Utilizar concordancia límite de 1 volver algún lugar de duplicados. Puede usar distinct o limit 1 o top 1 o tener el recuento Sry, para mi inglés

+1

Agregue alguna descripción para el código. @ HariKishore –

+1

Gracias por este fragmento de código, que puede proporcionar ayuda inmediata. Una explicación adecuada [mejoraría en gran medida] (// meta.stackexchange.com/q/114762) su valor educativo al mostrar * por qué * esta es una buena solución al problema, y ​​lo haría más útil para lectores futuros con similares, pero no idénticas, preguntas. Por favor [edite] su respuesta para agregar una explicación y dar una indicación de qué limitaciones y suposiciones se aplican. –

Cuestiones relacionadas