Sql server 2008 如何理解SQL Server 2008中的合并关键字

Sql server 2008 如何理解SQL Server 2008中的合并关键字,sql-server-2008,merge,Sql Server 2008,Merge,我对SQLServer2008的语法有一个基本的了解,但对这个概念的高级用法有一个疑问 假设我有一支有30名队员的运动队。每个选手都是一张桌子上的一张唱片。现在,在赛季的中途,一些球员离开了(受伤,无论什么),一些新的血液来代替他们 因此,我希望更新数据库表以准确反映这一变化 因此,当我使用MERGE语法时,如果新播放器不存在,则会插入: WHEN NOT MATCHED THEN INSERT blah blah blah... VALUES (blah blah and mo

我对SQLServer2008的语法有一个基本的了解,但对这个概念的高级用法有一个疑问

假设我有一支有30名队员的运动队。每个选手都是一张桌子上的一张唱片。现在,在赛季的中途,一些球员离开了(受伤,无论什么),一些新的血液来代替他们

因此,我希望更新数据库表以准确反映这一变化

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

WHEN NOT MATCHED THEN
    INSERT blah blah blah...
    VALUES (blah blah and more blah)..
当匹配时,则什么也不做(因此当匹配时,我不需要任何
子句)

但是那些离开的球员呢?当源不匹配时,
是否会进入播放状态


如果是这样,我应该如何使用它?

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

这个赛季从这支球队开始

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语句如下所示

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;  

是的,
当源代码不匹配时,
是您可以关心已离开的玩家的部分

根据,您可以在此处使用更新(例如,将
Active
atribute设置为
0
)或删除指令

您可以从文档中发现,可以有两个这样的部分。在这种情况下,其中一个使用附加条件定义,并且只能接受更新指令:

WHEN NOT MATCHED BY SOURCE AND condition THEN
    UPDATE SET ...
当源和条件不匹配时,则
更新集…
另一个不能使用条件,保留用于删除指令。

完美的解释:)我来试试看:)