2011-04-19 89 views
2

我對Sql Sever 2008的MERGE語法有基本的瞭解,但有一個關於這種概念的高級使用的問題。需要幫助理解MERGE關鍵字與Sql Server 2008的

想象一下,我有一個運動隊,其中有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>是否在那裏發揮(繁榮tish)?

如果是這樣,有人可以幫助建議我應該如何使用它?

回答

8

您可以像這樣使用合併,但是我猜想新團隊的源表必須包含整個新團隊,包括那些尚未修改的團隊。 這是一個簡化的示例。

賽季開始了與這個團隊在賽季

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

半路上教練意識到它不是最優有一隊有三個,而老QB的。 Brett拒絕退出,所以Joe必須離開。約翰可以玩RB,同時我們需要一些年輕人讓事情繼續下去。

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

MERGE語句合併NewTeamTeam應該是這樣的。

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; 
+0

完美的解釋:)我會給這個去:) – 2011-04-19 06:46:11

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 ...

其他不能使用的狀態和被保留用於刪除指令。