Sql 如果记录存在,则更新Else Insert
我正在尝试在两个SQLServer2008表之间移动一些数据。如果该记录存在于表2中,并带有来自表1的电子邮件,则使用来自表1的数据更新该记录,否则插入新记录 在表1中,我有许多列;名字、姓氏、电子邮件等 如果来自表1的电子邮件存在,我不太确定如何构造查询以更新表2;如果来自表1的电子邮件在表2中不存在,如何插入新行 我试着在谷歌上做了一些搜索,但大多数解决方案似乎都是通过创建一些存储过程来实现的。因此,我想知道是否有人知道如何构建一个合适的查询来实现这一目的?我想这正是您想要的。Microsoft发布了SQL表之间的查询,在某些情况下,这可能是一个不错的选择Sql 如果记录存在,则更新Else Insert,sql,sql-server,sql-server-2008,merge,upsert,Sql,Sql Server,Sql Server 2008,Merge,Upsert,我正在尝试在两个SQLServer2008表之间移动一些数据。如果该记录存在于表2中,并带有来自表1的电子邮件,则使用来自表1的数据更新该记录,否则插入新记录 在表1中,我有许多列;名字、姓氏、电子邮件等 如果来自表1的电子邮件存在,我不太确定如何构造查询以更新表2;如果来自表1的电子邮件在表2中不存在,如何插入新行 我试着在谷歌上做了一些搜索,但大多数解决方案似乎都是通过创建一些存储过程来实现的。因此,我想知道是否有人知道如何构建一个合适的查询来实现这一目的?我想这正是您想要的。Microso
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
编辑:忘了提到,它还生成一个脚本来插入/更新丢失的或不同的行
为了完整起见,我对这个查询进行了黑客攻击,它根据电子邮件地址更新现有的table2记录,并添加丢失的记录
下面的“更新”和“插入缺失”查询就是您想要的查询
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
这正是MERGE设计的目的。。。(有些学科称之为“UPSERT”,尽管它处理的不仅仅是插入/更新)。嘿,伙计,谢谢你花时间写出上面的查询。非常感谢。。。我将尝试一下。这适用于使用SQL 2008之前版本的任何人,因为只有SQL 2008才支持MERGE命令。他们从RTM发行版中取出了它。愚蠢的SQL团队。