2009-10-27 10 views
8

Estoy intentando mover algunos datos entre dos tablas de SQL Server 2008. Si el registro existe en la Tabla 2 con el correo electrónico de la Tabla 1, actualice ese registro con los datos de la Tabla 1, de lo contrario inserte un nuevo registro.Si existe el registro, actualice Else Insert

En la Tabla 1 tengo un número de columnas; nombre, apellido, correo electrónico, etc.

no estoy muy seguro de cómo estructurar la consulta para actualizar la Tabla2 si el correo electrónico de la Tabla1 existe o insertar una nueva fila si el correo electrónico de la Tabla1 no existe en la Tabla 2.

He intentado hacer algunas búsquedas en Google, pero la mayoría de las soluciones parecen funcionar mediante la creación de algún procedimiento almacenado. Entonces, me preguntaba si alguien podría saber cómo crear una consulta adecuada que podría ser útil.

Respuesta

9
MERGE 
INTO table2 t2 
USING table1 t1 
ON  t2.email = t1.email 
WHEN MATCHED THEN 
UPDATE 
SET  t2.col1 = t1.col1, 
     t2.col2 = t1.col2 
WHEN NOT MATCHED THEN 
INSERT (col1, col2) 
VALUES (t1.col1, t1.col2) 
20

Creo que MERGE es lo que quieres.

+0

+1 solución de Niza. –

+0

Esto es exactamente para lo que MERGE fue diseñado ... (algunas disciplinas lo llaman "UPSERT" aunque maneje más que INSERT/UPDATE). –

1

Microsoft lanzado a tool to compare data entre tablas SQL, esto podría una buena opción en ciertas situaciones.

Editar: Se olvidó de mencionar, sino que también genera una secuencia de comandos para insertar/actualizar falta o diferentes filas.

Para completar, me hackeado esta consulta, que hace lo que quiere, que actualiza los registros Table2 existentes, y añade los que faltan, sobre la base de la dirección de correo electrónico.

La 'actualización' y 'inserto desaparecidos' consultas a continuación son los que usted desea.

BEGIN TRAN 

create table #table1 (id int, fname varchar(20), email varchar(20)) 
insert into #table1 values (1, 'name_1_updated', 'email_1') 
insert into #table1 values (3, 'name_3_updated', 'email_3') 
insert into #table1 values (100, 'name_100', 'email_100') 


create table #table2 (id int, fname varchar(20), email varchar(20)) 
insert into #table2 values (1, 'name_1', 'email_1') 
insert into #table2 values (2, 'name_2', 'email_2') 
insert into #table2 values (3, 'name_3', 'email_3') 
insert into #table2 values (4, 'name_4', 'email_4') 

print 'before update' 
select * from #table2 

print 'updating' 
update #table2 
set #table2.fname = t1.fname 
from #table1 t1 
where t1.email = #table2.email 

print 'insert missing' 
insert into #table2 
select * from #table1 
where #table1.email not in (select email from #table2 where email = #table1.email) 

print 'after update' 
select * from #table2 

drop table #table1 
drop table #table2 

ROLLBACK 
+0

Hola, hombre, gracias por pasar el tiempo para escribir la consulta anterior. Muy apreciado ... intentaré esto. – doubleplusgood

+0

Esto para cualquiera que use pre SQL 2008, ya que el comando MERGE solo se admite en SQL 2008. Lo extrajeron de la versión RTM. Equipo tonto de SQL. – invert

Cuestiones relacionadas