我对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>
进场(繁荣时期)?
如果是这样,有人可以建议我应该如何使用它吗?
答案 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指令保留。