merge语句的好处是把两次连接查询合并到了一起,sql变得简单,减少了对表或索引的扫描(是这样么?)
坏处,不能最小日志记录
要merge的目标表不允许一条数据被更新多次,也就是 1,原表不能包含条件重复的数据,2,只能有一个update
MATCHED的条件下可以进行更新或者删除操作
Not Matched的条件下可以插入操作
可以把CTE和Merge一起使用,CTE来排重
;WITH tmp AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY [Name] ORDER BY Id) AS rowNum
FROM Table1 )
MERGE Table2 AS TGT
USING (SELECT * FROM tmp WHERE rowNum = 1) AS SRC
ON TGT.[Name] = SRC.[Name]
WHEN MATCHED AND TGT.Date < SRC.Date
THEN UPDATE SET
TGT.Value = SRC.Value
WHEN NOT MATCHED THEN INSERT ([Name], Value)
VALUES(SRC.[Name], SRC.Value);
merge语句在msdn有详细解释:http://technet.microsoft.com/en-us/library/bb510625.aspx
Merge语句索引的优化,和表连接索引的优化一样
1,创建源表Join列的唯一和覆盖索引
2,创建目标表的唯一聚集索引
详细信息:http://technet.microsoft.com/en-us/library/cc879317.aspx