Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果记录存在,则更新Else Insert_Sql_Sql Server_Sql Server 2008_Merge_Upsert - Fatal编程技术网

Sql 如果记录存在,则更新Else Insert

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

我正在尝试在两个SQLServer2008表之间移动一些数据。如果该记录存在于表2中,并带有来自表1的电子邮件,则使用来自表1的数据更新该记录,否则插入新记录

在表1中,我有许多列;名字、姓氏、电子邮件等

如果来自表1的电子邮件存在,我不太确定如何构造查询以更新表2;如果来自表1的电子邮件在表2中不存在,如何插入新行

我试着在谷歌上做了一些搜索,但大多数解决方案似乎都是通过创建一些存储过程来实现的。因此,我想知道是否有人知道如何构建一个合适的查询来实现这一目的?

我想这正是您想要的。

Microsoft发布了SQL表之间的查询,在某些情况下,这可能是一个不错的选择

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团队。