用简单的单词解释合并SQL语句?

时间:2013-11-03 15:19:09

标签: sql tsql sql-server-2008-r2

我正在阅读有关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 SOURCEWHEN NOT MATCHED BY Target怎么样?请帮帮我

4 个答案:

答案 0 :(得分:1)

合并基本上会合并两个表的数据。如果目标表中存在源表中的ID字段,它将执行UPDATE语句(WHEN MATCHED THEN)。如果它不存在,它将执行INSERTWHEN 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)

我认为将targetsource的记录分支到不同的执行路径中。

下面我举一个简单的数字列表示例。我使用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没有行时