2011-10-27 18 views
36

Actualizar muchas filas en una tabla de otra tabla sobre la base de una columna en cada uno siendo igual (user_id).filas de actualización en una tabla con datos de otra tabla basan en una columna en cada ser igual

ambas tablas tienen una columna user_id. Necesita insertar datos del t2 en t1 cuando la columna user_id es igual.

Gracias de antemano por cualquier ayuda ofrecida.

+0

Votación máxima. Consulte la pregunta relacionada: http://stackoverflow.com/q/7030699/435605 –

Respuesta

49
update 
    table1 t1 
set 
    (
    t1.column1, 
    t1.column2 
    ) = (
    select 
     t2.column1, 
     t2.column2 
    from 
     table2 t2 
    where 
     t2.column1 = t1.column1 
    ) 
    where exists (
     select 
     null 
     from 
     table2 t2 
     where 
     t2.column1 = t1.column1 
    ); 

O esto (si t2.column1 < => t1.column1 son muchos a uno y cualquiera de ellos es bueno):

update 
    table1 t1 
set 
    (
    t1.column1, 
    t1.column2 
    ) = (
    select 
     t2.column1, 
     t2.column2 
    from 
     table2 t2 
    where 
     t2.column1 = t1.column1 
    and 
     rownum = 1  
    ) 
    where exists (
     select 
     null 
     from 
     table2 t2 
     where 
     t2.column1 = t1.column1 
    ); 
+0

Muchas gracias. ¡Funciona como un amuleto después de corregir los datos para eliminar duplicados! – JcR49

+0

Esta respuesta es correcta y muy útil.Gracias. – JcR49

+0

@JohnRose, de nada! –

25

Si desea actualizar las filas coincidentes en t1 con datos de t2 a continuación:

update t1 
set (c1, c2, c3) = 
(select c1, c2, c3 from t2 
where t2.user_id = t1.user_id) 
where exists 
(select * from t2 
where t2.user_id = t1.user_id) 

La "donde existe" una parte que para evitar la actualización de las columnas t1 a null, donde no existe ninguna coincidencia.

+1

Gracias. Al igual que otras consultas que he intentado, esto devuelve 'consulta de una sola fila rturns muchas filas' .. No insertará/actualizará nada. – JcR49

+0

Hay casi mil filas para actualizar ....... – JcR49

+1

¿Entonces user_id no es único en t1? En ese caso, ¿cómo sabe ** para qué ** t1 obtener los valores? –

5

No es una inserción si el registro ya existe en t1 (user_id partidos) menos que están dispuestos para crear duplicados de user_id.

Es posible que desee una actualización?

UPDATE t1 
    SET <t1.col_list> = (SELECT <t2.col_list> 
          FROM t2 
         WHERE t2.user_id = t1.user_id) 
WHERE EXISTS 
     (SELECT 1 
     FROM t2 
     WHERE t1.user_id = t2.user_id); 

creo que sirve ...

+0

ORA-01427: de una sola fila subconsulta devuelve más de una fila – JcR49

+0

la que vuelven a la misma ora 01427 hilera consulta devuelve más de una fila. – JcR49

+0

Recibirá un error ORA-01427 si la relación no es uno a uno. Eso significa que su declaración equijoin no puede coincidir con éxito un registro en el registro de la tabla uno a uno en la tabla dos. – Nathan

14
merge into t2 t2 
using (select * from t1) t1 
on (t2.user_id = t1.user_id) 
when matched then update 
set 
    t2.c1 = t1.c1 
, t2.c2 = t1.c2 
2

Siempre podría usar y omitir la sección "cuando no coincida"

merge into table1 FromTable 
    using table2 ToTable 
    on  (FromTable.field1 = ToTable.field1 
      and FromTable.field2 =ToTable.field2) 
when Matched then 
update set 
    ToTable.fieldr = FromTable.fieldx, 
    ToTable.fields = FromTable.fieldy, 
    ToTable.fieldt = FromTable.fieldz) 
when not matched then 
    insert (ToTable.field1, 
     ToTable.field2, 
     ToTable.fieldr, 
     ToTable.fields, 
     ToTable.fieldt) 
    values (FromTable.field1, 
     FromTable.field2, 
     FromTable.fieldx, 
     FromTable.fieldy, 
     FromTable.fieldz); 
Cuestiones relacionadas