欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

如何理解T-SQL中Merge語句

系統 2374 0
原文: 如何理解T-SQL中Merge語句

寫在前面的話:之前看過Merge語句,感覺沒什么用,完全可以用其他的方式來替代,最近又看了看Merge語句,確實挺好用,可以少寫很多代碼,看起來也很緊湊,當然也有別的優點。

====正文開始=====

  SQL Server 2008 引入了Merge關鍵字,主要是在一條語句里面可以執行insert、update、delete操作,以實現用一個 源對象 的數據對 目標對象 數據進行操作。注意這里的”源對象“和”目標對象“我用黑色標注了,源對象和目標對象實際上不僅僅可以是表Table,還可以是臨時表、視圖、表變量、CTE,同時”目標對象“還可以是 Select語句 ,說這么多其實想表達Merge語句可以很靈活的使用,但是我們理解的話,可以把”源對象“和”目標對象“想象成Table就行了,畢竟臨時表、視圖、表變量、CTE也都可以想象成Table。

(注意:如果目標對象是視圖的話,那么對目標對象的操作,如update,實際上是對生成視圖的表進行操作的)。

  好了,看完上面的文字,你可能已經看不下去了,之所以寫上面的話,是為了顯得嚴謹一些,接下來就用例子來講解吧,這個例子不涉及業務邏輯,可以專注于理解Merge的用法,至于實際中什么時候用,只能自己悟了,好了,開始舉例子。

  例如有一個Student_Target表,如下 表一 ,另外一個Student_Source表,如下 表二

如何理解T-SQL中Merge語句

  執行如下SQL語句:

      MERGE INTO Student_Target AS st   --這里是目標表,它將要被源表Merge

USING Student_Source AS ss       --這里是源表

ON st.Sno = ss.Sno          --這里是匹配條件

    WHEN MATCHED           --When和Then是配套的,當st.sno=ss.sno時,用ss.sname更新st.sname,我們看到這里update后面沒有寫明更新的表,這里更新的是目標表

        THEN UPDATE SET st.Sname = ss.Sname  

    WHEN NOT MATCHED BY TARGET  --目標表中不存在,而源表中存在數據,那么就執行insert操作,這里by target可以省略,但是建議加上

        THEN INSERT VALUES    ( ss.Sno,ss.Sname)

    WHEN NOT MATCHED BY SOURCE   --當目標表中存在,而源表中不存在數據,那么就執行delete操作,這里使用了by source

		THEN DELETE

;

    


    

  上面SQL語句的意思可以看后面的注釋,這里再做一簡要說明:對于表一,sno=1的一行和表二sno=1的匹配,所以表一中該行被更新;表一中sno=2,3在表二中不存在,因此delete,表二中sno=4但是在表一中不存在,因此insert,最后結果如下:

  我們看到上面的結果和表二的內容是一樣的,其實你再分析一下上面的SQL語句,邏輯就是把表二的內容弄進表一,表一中和表二中不一致的數據刪除,似乎我們上面的Merge語句顯得很多余。這里想再說明幾點:

(1)我們When matched、When not matched by target、when not matched by source都寫上了,其實是可選的,我們可以根據自己的需求只使用其中的部分。

(2)前面是Merge into Student_Target as st,其實可以增加top(n)來對特定數量的行進行操作。執行如下SQL:?

      MERGE TOP(2) INTO Student_Target AS st   --這里是目標表,它將要被源表Merge

USING Student_Source AS ss       --這里是源表

ON st.Sno = ss.Sno          --這里是匹配條件

    WHEN MATCHED           --When和Then是配套的,當st.sno=ss.sno時,用ss.sname更新st.sname,我們看到這里update后面沒有寫明更新的表,這里更新的是目標表

        THEN UPDATE SET st.Sname = ss.Sname  

    WHEN NOT MATCHED BY TARGET  --目標表中不存在,而源表中存在數據,那么就執行insert操作,這里by target可以省略,但是建議加上

        THEN INSERT VALUES    ( ss.Sno,ss.Sname)

    WHEN NOT MATCHED BY SOURCE   --當目標表中存在,而源表中不存在數據,那么就執行delete操作,這里使用了by source

		THEN DELETE

;

    


    

?  最后結果如下:

如何理解T-SQL中Merge語句

  所以,增加了top(2),那么目標表可以被操作的行只能是2條,上面的update操作一條,insert操作一條,達到2條,因此后面的delete就不影響了。因此, 對于top(n)應該能夠正確的理解。 ?

(3)前面when matched 其實還可以配合其他條件一起操作,例如when matched 可以修改為when matched and ss.sno=1或者when matched and st.sno=1;對于when not matched, 只能夠使用源列 ,也就是說,增加and ss.sno=1可以,但是增加and st.sno=1就會報錯了。

(4)Merge最后一定要以分號結尾,表示這個Merge句子完整了。

  前面的操作我們看到默認的都是對Target表的操作,有時候我們想對Target表操作后,還能夠針對特定的條件,對Source表進行操作,這是就可以配合Output子句一起,來完成我們想要的操作。這里Output字句不單單是針對merge語句的,對于insert、update、delete等操作也可以用的,所以具體的可以再去單獨研究研究output子句。

  至此,本文也該告一段落,如何使用Merge語句應該也沒有問題。可是心中仍然有一個結,正如上篇文章所寫的: 如何理解group by和聚合函數 中對group by和聚合函數的認識一樣,雖然用起來不成問題,但是總是希望能夠找到一個天馬行空的想法,能夠換個角度去認識。比如為啥基本上都是when matched后面跟update,when not matched by target后面跟insert,when not matched by source 后面跟delete呢?為啥when not matched by target后面不能跟delete?為啥when not matched by source后面不能跟insert呢?當然可能還有其他疑問,目前可以跟join結合起來應該能夠很好的解釋清楚,可是現在還無法用很好的文字邏輯去表達清楚,回頭想好怎么寫了再寫吧,請原諒我又”胡思亂想“了。

  備注:上面的結已經解開了,可以看下一篇博文: 如何理解T-SQL中Merge語句(二)

?

如何理解T-SQL中Merge語句


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 99热精品在线观看 | 欧美xxxxx视频在线 | 久久精品呦女 | 男女在线无遮挡毛片免费 | 日韩啊啊啊 | 美国av在线免费观看 | 日本中文在线观看 | 成人国产精品 | 国产色产综合色产在线观看视频 | 香蕉香蕉国产片一级一级毛片 | 日日操美女 | 精品一区二区三区在线视频 | 成 人 片 在线观看 激情五月六月婷婷 | 人人亚洲 | 草草视频在线观看 | 国产换爱交换乱理伦片 | 婷婷开心六月久久综合丁香 | 成人毛片免费播放 | 东京久久 | 亚洲视频免费在线观看 | 国产精品久久99 | av毛片免费看 | 牛牛热在线视频 | 亚洲欧美日韩国产精品26u | 亚洲精品不卡 | 国产chinese中国hdxxxx | 午夜影院色 | 亚洲第一成人在线 | 高清一区二区三区 | 国产免费一区二区 | 国产精品成人免费一区久久羞羞 | 奇米在线观看视频 | 国产精品在线 | 亚洲视频免费在线 | 亚洲精品国产精品乱码不97 | 亚洲综合久久成人A片红豆 日本亚洲成人 | 日韩欧美国产一区二区 | 网站国产 | 久久亚洲最大成人网4438 | 亚洲日本va | 久久精品国产免费 |