需要帮助了解使用Sql Server 2008的MERGE关键字

时间:2011-04-19 05:24:38

标签: sql-server-2008 merge

我对Sql Sever 2008的MERGE语法有基本的了解,但对于该概念的高级使用有疑问。

想象一下,我有一支拥有30名球员的运动队。每个玩家都是一张桌子上的记录。现在,在整个赛季的一半时间里,一些球员已经离开(受伤,无论如何)一些新的血液来取代他们。

所以我希望更新数据库表以准确反映这一变化。

因此,当我使用MERGE语法时,如果新播放器不存在,则插入它:

WHEN NOT MATCHED THEN
    INSERT blah blah blah...
    VALUES (blah blah and more blah)..

当匹配时,什么也不做。 (所以我不需要任何WHEN MATCHED THEN条款。)

但那些离开的球员呢?是否有WHEN NOT MATCHED BY SOURCE THEN <merge_matched>进场(繁荣时期)?

如果是这样,有人可以建议我应该如何使用它吗?

2 个答案:

答案 0 :(得分:9)

您可以像这样使用合并,但我想新团队的源表必须包含整个新团队,包括那些尚未修改的团队。 这是一个简化的样本。

本赛季从​​这支球队开始

PlayerName           Position
-------------------- --------
Brett Favre          QB
Joe Montana          QB
John Elway           QB

在整个赛季中途,教练意识到拥有一支拥有三个相当古老的QB的球队并不是最佳选择。布雷特拒绝退出,所以乔必须离开。约翰开始玩RB,同时我们需要一些年轻人才能让事情顺利进行。

PlayerName           Position
-------------------- --------
Brett Favre          QB
John Elway           RB
Jerry Rice           WR
Karl Mecklenburg     LB

NewTeam合并到Team的合并语句如下所示。

merge Team as T
using NewTeam as S
on S.PlayerName = T.PlayerName
when matched then
  update set Position = S.Position
when not matched by target then
  insert (PlayerName, Position) values (S.PlayerName, S.Position)
when not matched by source then
  delete;  

答案 1 :(得分:2)

是的,WHEN NOT MATCHED BY SOURCE THEN <merge_matched>是您可以关注已经离开的球员的部分。

根据doc,您可以使用UPDATE(例如,将Active属性设置为0)或DELETE指令。

您可以从文档中找到可以有两个这样的部分。在这种情况下,其中一个定义了附加条件,并且只能接受UPDATE指令:

WHEN NOT MATCHED BY SOURCE AND condition THEN
    UPDATE SET ...

另一个不能使用条件,并且为DELETE指令保留。