我正在阅读有关MERGE的msdn主题。http://msdn.microsoft.com/en-us/library/bb510625.aspx
但这对我来说非常困惑。假设我有一张桌子,
DECLARE @T Table
(
ID INt,
Name VARCHAR(10)
)
我有,
MERGE INTO @T T1
USING (SELECT 4 AS ID) T2 ON (T1.ID = T2.ID)
每次找到匹配项时都会执行{p> WHEN MATCHED THEN
,每次找不到匹配项时都会执行WHEN NOT MATCHED THEN
?这是对的吗?那么WHEN NOT MATCHED BY SOURCE
和WHEN NOT MATCHED BY Target
怎么样?请帮帮我
答案 0 :(得分:1)
合并基本上会合并两个表的数据。如果目标表中存在源表中的ID字段,它将执行UPDATE
语句(WHEN MATCHED THEN
)。如果它不存在,它将执行INSERT
(WHEN NOT MATCHED BY TARGET
)。
WHEN NOT MATCHED BY SOURCE
表示目标表中的一行在源表中不存在。这通常表示该行已在源系统中删除,您必须决定如何处理它。 (在跨国系统的情况下,简单地删除行,而如果您正在处理数据仓库,则需要保留数据,但将其标记为“非活动”或沿着这些行的某些内容)。
在拥有MERGE
语句之前,必须自己编写这个逻辑。
答案 1 :(得分:1)
您获取源表,并尝试将新记录合并到此源表中。您可以根据源数据和新数据设置条件以检查。如果条件为真,那么这是匹配,如果不是,则不匹配,每个都有自己的语句。
最常用的(来自我见过/使用过的sql)想要决定是将新数据添加到带插入的源,还是更新现有记录。例如,产品库存,您可能正在添加新库存或更新现有库存的数量。
这里有一个很好的例子可以关注https://www.simple-talk.com/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/
答案 2 :(得分:1)
我认为将target
和source
的记录分支到不同的执行路径中。
下面我举一个简单的数字列表示例。我使用full join
来表示合并,使用case
来表示'分支'。
DECLARE @source TABLE ( i INT, c CHAR(1) )
DECLARE @target TABLE ( i INT )
INSERT INTO @source ( i )
VALUES (1), (2), (3), (4), (5)
INSERT INTO @target ( i )
VALUES (1), (2), (3), (6), (7)
SELECT
[source] = s.i,
[target] = t.i,
[branch] = CASE WHEN t.i IS NULL THEN 'not matched by target'
WHEN s.i IS NULL THEN 'not matched by source'
ELSE 'matched' END,
[possible action] = CASE WHEN t.i IS NULL THEN 'insert into target'
WHEN s.i IS NULL THEN 'update target or delete from target'
ELSE 'update target or delete from target' END
FROM @source s
FULL JOIN @target t ON t.i = s.i
这会产生以下内容
source target branch possible action
----------- ----------- --------------------- -----------------------------------
1 1 matched update target or delete from target
2 2 matched update target or delete from target
3 3 matched update target or delete from target
4 NULL not matched by target insert into target
5 NULL not matched by target insert into target
NULL 6 not matched by source update target or delete from target
NULL 7 not matched by source update target or delete from target
所以
not matched by target
)时,这些内容可以insert
加入目标not matched by source
)中没有匹配时,相应的目标记录可以是update
d或delete
d这里显然不会有任何匹配要记录的源记录。matched
)匹配时,目标记录也可以是update
d或delete
d但与[{1}}不同,此处您还可以来自消息的记录。 注意更新和删除,不需要使用连接或以其他方式将源与目标相关联,在“分支”内将目标与目标等相关联,因为这些关系已经被解决,就好像你是根据个人记录行事。
e.g。您可能认为必须进行更新
not matched by source
但事实并非如此。
当记录为 Update t
Set t.col = s.col
From target t
Join source s On s.id = t.id
或matched
时,可以进一步预测数据,以决定是否应该not matched by source
d或delete
d。这是通过提供两个相同的“分支”和update
AND
example d
中显示的附加{{1}}子句来完成的。
答案 3 :(得分:0)
后两者应该是显而易见的。如果未找到匹配项,则表示一个或另一个表没有另一个表所在的行。也就是说,T1可能有一行,但T2中没有相应的行,或T2可能有一行,但T1中没有对应的行。 T2是源,T1是目标,所以当你说NOT MATCHED BY SOURCE
时你正在指定当T2没有行时发生的动作,而NOT MATCHED BY TARGET
是指当T1没有行时