Merge Into 用法

从一个数据库的一张表同步数据到另外一个数据库的一张表,同步的数据不是insert就是update。

一般做法是先判断当前数据在另外一张表存不存在,存在则更新,不存在则插入。需要一次查询判断:exist或count(*)>0,

然而用Merge Into 更为简洁:

CREATE PROC [dbo].[XXX_SynchroMaterial]
@userID nvarchar(50)
as
begin
declare @nResult int; --同步多少条物料

declare @totalRows    int;
set @nResult=0;

--建立临时数据表
create table #tmpMateriel
(
[id] int IDENTITY(1,1) ,
MaterielGUID nvarchar(50),
MaterielCode nvarchar(50),
MaterielName  nvarchar(255),
ParentNode nvarchar(50),
IfLeafNode bit,
Material_Category int null,
Raw_Material_Category int null
)  

--读取物料中间表数据,插入到临时表
insert into #tmpMateriel(MaterielGUID,MaterielCode,MaterielName,ParentNode,IfLeafNode,Material_Category,Raw_Material_Category)
SELECT [MaterielGUID]
      ,[MaterielCode]
      ,[MaterielName]
      ,[ParentNode]
      ,[IfLeafNode]
      ,CASE WHEN (MaterielCode like ‘1.03%‘ or MaterielCode like ‘2.02%‘)  THEN 1
           WHEN (MaterielCode like ‘1.04%‘ or MaterielCode like ‘2.03%‘) THEN 2
           ELSE 3
       END
      ,CASE WHEN [IfLeafNode]=1 THEN 4  --小料
       ELSE null
       END

  FROM [ChwareXXXInterface].[dbo].[Tab_Materiel_Interface] where [If_Read]=0;

select @nResult=COUNT(*) from #tmpMateriel;  

Merge Into [ChwareXXX].[dbo].[Tab_Material] t
USING (select [MaterielCode],[MaterielName],[ParentNode],[IfLeafNode],[Material_Category],[Raw_Material_Category] from #tmpMateriel)as s
on t.[MaterialCode]=s.[MaterielCode]
When Matched Then Update set t.[MaterialName]=s.[MaterielName],
                             t.[ParentNode]=s.[ParentNode],
                             t.[IfLeafNode]=s.[IfLeafNode],
                             t.[Material_Category]=s.[Material_Category],
                             t.[Raw_Material_Category]=s.[Raw_Material_Category],
                             t.[ModifyUser]=@userID,
                             t.[ModifyDT]=getdate()
When Not Matched Then Insert ([MaterialCode],[MaterialName],[ParentNode],[IfLeafNode],[Material_Category],[Raw_Material_Category],[CreateUser],[CreateDt])
                      values (s.[MaterielCode],s.[MaterielName],s.[ParentNode],s.[IfLeafNode],s.[Material_Category],s.[Raw_Material_Category],@userID,getdate());

--更新接口表读取状态
update [ChwareXXXInterface].[dbo].[Tab_Materiel_Interface] set [If_Read]=1,ReadDT=GETDATE()where MaterielCode in (select MaterielCode from #tmpMateriel);

--删除临时表
drop table #tmpMateriel;
select @nResult; --同步成功多少条数据
end
GO

总结:

通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。

语法:
MERGE [INTO [schema .] table [t_alias] 
USING [schema .] { table | view | subquery } [t_alias] 
ON ( condition ) 
WHEN MATCHED THEN merge_update_clause 
WHEN NOT MATCHED THEN merge_insert_clause;

时间: 2024-10-14 14:43:49

Merge Into 用法的相关文章

SQL2008中Merge的用法

在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge [into] [目标表]using <源表>on 条件when matched 操作 when not matched 操作; 首先,请参看两张表 TableThis和TableThat: 可以看到,这两张表中的内容还是比较简单的,两张表通过一个tbThisID进行主键和外键的关联,那么如如果想实

SQL2008中Merge的用法(轉載)

在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge [into] [目标表]using <源表>on 条件when matched 操作 when not matched 操作; 首先,请参看两张表 TableThis和TableThat: 可以看到,这两张表中的内容还是比较简单的,两张表通过一个tbThisID进行主键和外键的关联,那么如如果想实

SQL2008中Merge的用法(转)

在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge [into] [目标表]using <源表>on 条件when matched 操作 when not matched 操作; 可以看到,这两张表中的内容还是比较简单的,两张表通过一个tbThisID进行主键和外键的关联,那么如如果想实现二者之间的数据同步,该如何进行呢,请看具体的Merge代码:

Oracle中Merge into用法总结 (转载)

Oracle中Merge into用法总结 (出处:http://www.cnblogs.com/dongsheng/p/4384754.html) 起因: 前段时间,因为涉及到一张表的大数据操作,要同时进行增删改,我跟师傅想了很多优化办法,结果都不尽人意.刚开始用的就是原始算法,先更新现有记录,再插入满足要求的其他记录,最后再删除多余记录,但是少量数据还可以,10W条数据就不行了,前台的超时时间是60s,远远无法满足要求.之后又想办法将任务进行拆分,根据每条记录流水号尾字符不同进行拆分,用多个

ORACLE 10 g的 merge into 用法

在Oracle 10g之前,merge语句支持匹配更新和不匹配插入2种简单的用法,在10g中Oracle对merge语句做了增强,增加了条件选项和DELETE操作.下面我通过一个demo来简单介绍一下10g中merge的增强和10g前merge的用法. 参考Oracle 的SQL Reference 下面我在一下环境中做一个测试看看 创建表subs  和 acct create table subs( msid number(9), ms_type char(1), areacode numbe

pandas-16 pd.merge()的用法

pandas-16 pd.merge()的用法 使用过sql语言的话,一定对join,left join, right join等非常熟悉,在pandas中,merge的作用也非常类似. 如:pd.merge(df1, df2) 找到一个外键,然后将两条数据合并成一条. 直接上例子: import numpy as np import pandas as pd from pandas import Series, DataFrame df1 = DataFrame({'key':['X', 'Y

SQLServer之merge函数用法

MERGE 目标表 USING 源表 ON 匹配条件 WHEN MATCHED THEN 语句 WHEN NOT MATCHED THEN 语句; 其中最后语句分号不可以省略,且源表既可以是一个表也可以是一个子查询语句 WHEN NOT MATCHED BY TARGET表示目标表不匹配,BY TARGET是默认的,所以上面我们直接使用WHEN NOT MATCHED THEN WHEN NOT MATCHED BY SOURCE表示源表不匹配,即目标表中存在,源表中不存在的情况. 主要用法:

Oracle 的merge into 用法

1.merge into的用途 Merge是一个非常有用的功能,与DB2中的merge into功能几乎一样,与Mysql里的insert into on duplicate key也很类似.MERGE INTO 是Oracle 9i以后才出现的新的功能.简单来说可以是一个“有则更新,无则插入”的功能. 通过Merge into你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现

ORCAL Merge into用法总结

简单的说就是,判断表中有没有符合on()条件中的数据,有了就更新数据,没有就插入数据. 有一个表T,有两个字段a.b,我们想在表T中做Insert/Update,如果条件满足,则更新T中b的值,否则在T中插入一条记录.在Microsoft的SQL语法中,很简单的一句判断就可以了,SQL Server中的语法如下: 用法: ifexists(select1from T where T.a='1001' ) update Tset T.b=2Where T.a='1001' else inserti

Oracle中Merge into用法总结

MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句.通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT.这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE. 语法: MERGE INTO [your table-name] [rename your table here] USING ( [write your query here] )[rename