Если запись существует, обновите еще вставку - PullRequest
10 голосов
/ 27 октября 2009

Я пытаюсь переместить некоторые данные между двумя таблицами SQL Server 2008. Если запись существует в Таблице 2 с электронным письмом из Таблицы1, обновите эту запись данными из Таблицы1, в противном случае вставьте новую запись.

В таблице 1 у меня есть несколько столбцов; имя, фамилия, адрес электронной почты и т. д.

Я не совсем уверен, как структурировать запрос для обновления таблицы 2, если электронная почта из таблицы 1 существует, или вставить новую строку, если электронная почта из таблицы 1 не существует в таблице 2.

Я попытался выполнить несколько поисков в Google, но большинство решений, кажется, работают, создавая некоторые хранимые процедуры. Поэтому мне было интересно, кто-нибудь может знать, как создать подходящий запрос, который бы помог?

Ответы [ 3 ]

21 голосов
/ 27 октября 2009

Я думаю MERGE - это то, что вы хотите.

11 голосов
/ 28 октября 2009
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)
1 голос
/ 27 октября 2009

Microsoft выпустила инструмент для сравнения данных между таблицами SQL, это может быть хорошим вариантом в определенных ситуациях.

Редактировать: Забыл упомянуть, он также генерирует скрипт для вставки / обновленияпропущенные или разные строки.

Для полноты я взломал этот запрос, который делает то, что вы хотите, он обновляет существующие записи таблицы 2 и добавляет те, которые отсутствуют, на основе адреса электронной почты.

Запросы "обновление" и "вставка отсутствующих" ниже - это те, которые вам нужны.

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
...