亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

如何理解T-SQL中Merge語(yǔ)句(二)

系統(tǒng) 2441 0
原文: 如何理解T-SQL中Merge語(yǔ)句(二)

寫在前面的話:上一篇寫了 如何理解T-SQL中Merge語(yǔ)句 ,基本把Merge語(yǔ)句要講的給講了,在文章的后面,拋出了幾個(gè)結(jié),當(dāng)時(shí)沒有想明白怎么去用文字表達(dá),這一篇就來(lái)解答一下這幾個(gè)結(jié),又是一篇“天馬行空”的文字,大家湊合看吧。

===正文開始===

  先看下面表一(Student_Target)和表二(Student_Source)。

如何理解T-SQL中Merge語(yǔ)句(二)

一、When Matched部分

  執(zhí)行下面SQL語(yǔ)句:

      MERGE INTO Student_Target AS st

USING Student_Source AS ss

ON st.Sno = ss.Sno

    WHEN MATCHED 

        THEN UPDATE SET st.Sname = ss.Sname

;


    

  執(zhí)行完上面SQL語(yǔ)句后,現(xiàn)在的Student_Target表的內(nèi)容應(yīng)該也很容易得到,如下圖:

如何理解T-SQL中Merge語(yǔ)句(二)

  Student_Target表中Sno=1,2的行的Sname值被Student_Source中相應(yīng)的值update,不過(guò)這個(gè)結(jié)果是怎么來(lái)的呢?今天用另外一種思路來(lái)理解一下怎么得到的,我們?cè)黾右粋€(gè)中間過(guò)程,表述如下:

  (1)上面的SQL語(yǔ)句:MERGE INTO......WHEN MATCHED,可以類比成一個(gè)inner join語(yǔ)句:select * from Student_Target as st inner join Student_Source as ss on st.Sno=ss.Sno,內(nèi)部聯(lián)接后,結(jié)果如下圖:

? 如何理解T-SQL中Merge語(yǔ)句(二)

  其中紅色框內(nèi)是Student_Target部分,藍(lán)色為Student_Source部分,這個(gè)圖表示的是什么呢?我們可以認(rèn)為后面執(zhí)行的操作僅僅影響圖中紅色的Student_Target部分,因此,執(zhí)行Then update set st.sname=ss.sname,那么原始表一Student_Target中只有 上圖紅色框中的部分受影響 ,即紅框中Sname依次被藍(lán)框內(nèi)Sname給update了,其他行(3,'cc')不受影響,因此Student_Target最后結(jié)果為:

如何理解T-SQL中Merge語(yǔ)句(二)

  (2)照此思路,如果Then update set st.sname=ss.sname 改成Then delete, 自然只是紅色框中部分被刪除,最后Student_Target結(jié)果如下圖,僅僅留下了一行。

  (3)照此思路,如果Then update set st.sname=ss.sname 改成Then insert values(ss.sno,ss.sname),會(huì)出現(xiàn)什么情況呢? 再看前面的紅色和藍(lán)色部分,紅色部分內(nèi)容不為NULL,因此無(wú)法用右邊的藍(lán)色部分給insert進(jìn)去,所以應(yīng)該報(bào)錯(cuò),執(zhí)行一下,果然報(bào)下面的錯(cuò)誤:

如何理解T-SQL中Merge語(yǔ)句(二)

  現(xiàn)在應(yīng)該明白When Matched為什么不允許有insert語(yǔ)句了吧,那么什么時(shí)候允許insert語(yǔ)句呢,接著往下看。

二、When NOT Matched BY Target部分

  前面When Matched我們通過(guò)inner join的思路進(jìn)行了理解,這次When NOT Matched BY Target我們用right outer join的思路去想想,同樣原始表格還是表一和表二,再次貼圖如下:

如何理解T-SQL中Merge語(yǔ)句(二)

執(zhí)行下面SQL語(yǔ)句:

      MERGE INTO Student_Target AS st

USING Student_Source AS ss

ON st.Sno = ss.Sno

    WHEN NOT MATCHED BY TARGET

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

;


    

  先不用著急看上面運(yùn)行結(jié)果,我們先用right outer join的思路去梳理一下:

  (1)上面的SQL語(yǔ)句:MERGE INTO......WHEN NOT MATCHED BY TARGET,可以類比成一個(gè)right outer join語(yǔ)句:select * from Student_Target as st right outer join Student_Source as ss on st.Sno=ss.Sno,右外部聯(lián)接后(你應(yīng)該對(duì)right outer join 概念非常清晰吧),結(jié)果如下圖:

? 如何理解T-SQL中Merge語(yǔ)句(二)

  其中紅色框內(nèi)是Student_Target部分,藍(lán)色為Student_Source部分,這個(gè)圖表示的是什么呢?我們可以認(rèn)為后面執(zhí)行的操作僅僅影響圖中紅色的Student_Target部分,因此,執(zhí)行Then insert values(ss.Sno,ss.Sname),那么原始表一Student_Target中只有 上圖紅色框中的部分受影響 ,即紅框中Sno和Sname為null的依次被藍(lán)框內(nèi)Sno和Sname給insert了,這里之所以可以insert,就是因?yàn)榈谌泻偷谒男欣锩嬗衝ull的值,因此最后Student_Target的運(yùn)行結(jié)果為:

如何理解T-SQL中Merge語(yǔ)句(二)

  (2)照此思路,如果Then insert values(ss.Sno,ss.Sname) 改成Then delete, 自然只是紅色框中部分被刪除,但是紅色部分的第三行和第四行是全為NULL的值,全null了自然無(wú)法刪除啊,因此應(yīng)該報(bào)錯(cuò),運(yùn)行一下,果然報(bào)錯(cuò)如下:

如何理解T-SQL中Merge語(yǔ)句(二)

  (3)照此思路,如果Then insert values(ss.Sno,ss.Sname) 改成Then update set st.Sname=ss.Sname ,同樣因?yàn)槿玭ull的行會(huì)報(bào)錯(cuò),因?yàn)槿玭ull無(wú)法更新啊,報(bào)錯(cuò)信息如下:

如何理解T-SQL中Merge語(yǔ)句(二)

  現(xiàn)在應(yīng)該明白When NOT Matched BY Target為什么不允許有update和delete語(yǔ)句了吧。

三、When NOT Matched BY SOURCE部分

  前面When Matched我們通過(guò)inner join的思路進(jìn)行了理解,When NOT Matched BY Target用right outer join的思路去理解了,這次的When not matched by source自然應(yīng)該用left outer join 來(lái)理解了,具體理解過(guò)程仿照第二部分,就不詳細(xì)寫了,直接上結(jié)果吧:

  同樣原始表格還是表一和表二,貼圖如下:

如何理解T-SQL中Merge語(yǔ)句(二)

  (1)執(zhí)行如下SQL語(yǔ)句:select * from Student_Target as st left outer join Student_Source as ss on st.Sno=ss.Sno,左外部聯(lián)接后,結(jié)果如下圖:

如何理解T-SQL中Merge語(yǔ)句(二)

  (2)執(zhí)行下面SQL語(yǔ)句:

      MERGE INTO Student_Target AS st

USING Student_Source AS ss

ON st.Sno = ss.Sno

    WHEN NOT MATCHED BY SOURCE

        THEN delete

;


    

  最后Student_Target的運(yùn)行結(jié)果為:

? 如何理解T-SQL中Merge語(yǔ)句(二)

  刪除了Student_Target中有而Student_Source中沒有的行。

  (2)執(zhí)行insert和update語(yǔ)句同樣報(bào)錯(cuò)。

四、最后總結(jié)

  很佩服你竟然能看到這里,最后來(lái)一個(gè)總結(jié)吧:

(1)when matched:類比inner join去思考,可以執(zhí)行update和delete操作,無(wú)法執(zhí)行insert操作。

(2)when not matched by target:類比right outer join去思考,可以執(zhí)行insert操作,無(wú)法執(zhí)行update和delete操作。 (target表中沒有(not matched),而source表中有)

(3)when not matched by source,類比left outer join去思考,可以執(zhí)行delete 操作,無(wú)法執(zhí)行insert和update操作。 (target表中有,而source表中沒有(not matched))

?

?

備注:練習(xí)過(guò)程中用到的代碼:

?

      USE testDB

GO

MERGE INTO Student_Target AS st

USING Student_Source AS ss

ON st.Sno = ss.Sno

    --WHEN MATCHED 

        --THEN UPDATE SET st.Sname = ss.Sname

        --THEN  INSERT VALUES(ss.sno,ss.sname)

    --WHEN NOT MATCHED BY TARGET

		--THEN UPDATE set st.sname=ss.sname

    --WHEN NOT MATCHED BY SOURCE 

		--THEN UPDATE set st.Sname=ss.Sname,st.Sno=ss.Sno

	

;



TRUNCATE TABLE dbo.Student_Target



TRUNCATE TABLE dbo.Student_Source



insert into Student_Target (sno,sname)values(1,'aa'),(2,'bb'),(3,'cc')



insert into Student_Source (sno,sname)values(1,'xiaoming'),(2,'xiaoli'),(4,'xiaohong'),(5,'xiaoping')



SELECT * FROM dbo.Student_Target



SELECT * FROM dbo.Student_Source





SELECT * FROM dbo.Student_Target AS st INNER JOIN dbo.Student_Source AS ss

ON st.Sno=ss.Sno



SELECT * FROM dbo.Student_Target AS st RIGHT OUTER JOIN dbo.Student_Source AS ss

ON st.Sno=ss.Sno





SELECT * FROM dbo.Student_Target AS st LEFT OUTER JOIN dbo.Student_Source AS ss

ON st.Sno=ss.Sno


    

?

如何理解T-SQL中Merge語(yǔ)句(二)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产精品久久久久久久免费 | 成人性视频免费网站 | 午夜成人免费影院 | 成熟女人免费一级毛片 | 日本毛片网| 干夜夜| 欧美一区亚洲 | 成人午夜天 | 天天插天天舔 | 在线视频日韩精品 | 伊人久久欧美综合精品 | 久久国产精品一国产精品金尊 | 欧美在线一级精品 | 国产在线五月综合婷婷 | 中文字幕在线视频观看 | 狠狠色丁香婷婷综合久久来 | 最新国产午夜精品视频成人 | 在线视频 二区 | 女人国产香蕉久久精品 | 中文在线1区二区六区 | 久久成年视频 | 日韩一区二区国色天香 | 国产欧美日韩第一页 | 中文字幕亚洲精品第一区 | 手机看片日韩国产一区二区 | 91精品国产91久久久久久麻豆 | 久久这里只有精品18 | 在线免费黄色片 | 色综合天天干 | 999精品视频这里只有精品 | 久久国产成人精品国产成人亚洲 | 亚洲天堂国产精品 | 欧美黄色第一页 | 亚洲毛片在线免费观看 | 国产视频2021 | 久久综合中文字幕一区二区 | 久久青草社区 | 五月激情婷婷网 | 日本特级视频 | 亚洲欧美精品 | 99精品国产综合久久久久 |