merge into中加入不等於條件判斷

使用merge into,進行兩張表的對比,如果條件符合則update,不符合可以insert。

這裏的update和insert指的就是完整的update和insert的自語句。

所以可以做條件轉移的。

如果想要將A表和B表中某個列是相同的,想要跟新某個不同,可以用語句。

我開始是這麼想的:
報錯:
無法更新 ON 子句中引用的列: “A”."SERVICE_VERSION"

merge into service_parameter a
using osb_service_info b on( a.service_code = b.osb_service_code and a.service_version != b.osb_service_version)
when matched then update set a.service_version=b.osb_service_version;

後面發現是不能用!=,on裏面是不能用!=,on的作用是聯表,這是個基礎知識,對不起,我沒想到,於是我上網搜發現有個老哥比我更騷,是這麼想的:
把!=的條件假如到matched後面,我試了一下,語法還是報錯,是不行的。

MERGE INTO Photo p
USING TmpPhoto tp
ON p.ProductNumberID = tp.ProductNumberID and p.SHA1 = tp.SHA1
WHEN MATCHED AND p.Rank = tp.Rank THEN
    UPDATE SET p.VerifiedDate = getDate()
WHEN MATCHED AND p.Rank != tp.Rank AND tp.Rank != 1 THEN
    UPDATE SET p.VerifiedDate = getDate(), p.Rank = tp.Rank, p.Active = 0
WHEN MATCHED AND p.Rank != tp.Rank AND tp.Rank = 1 THEN
    UPDATE SET p.VerifiedDate = getDate(), p.Rank = tp.Rank, p.Active = 1
WHEN NOT MATCHED THEN
    INSERT (ProductNumberID, Code, Extension, Rank, CreatedDate, VerifiedDate, FCTH, SHA1, Active)
    VALUES (tp.ProductNumberID, tp.Code, tp.Extension, tp.Rank, getdate(), getdate(), tp.FCTH, tp.SHA1, 0)
    OUTPUT inserted.NumberID as PhotoNumberID, inserted.ProductNumberID, inserted.SHA1, inserted.Rank INTO InsertedPhotos;

大佬出來指正,應該這樣幹:

MERGE INTO Photo p
USING TmpPhoto tp
    ON p.ProductNumberID = tp.ProductNumberID and p.SHA1 = tp.SHA1
    WHEN MATCHED 
     THEN
       UPDATE SET 
           p.VerifiedDate = getDate(),
           p.RANK = tp.RANK,
           p.Active = 
              (CASE
                WHEN p.Rank != tp.Rank AND tp.Rank != 1 THEN 0
                WHEN p.Rank != tp.Rank AND tp.Rank = 1 THEN 1
                ELSE p.Active END
             )
    WHEN NOT MATCHED THEN
        INSERT (ProductNumberID, Code, Extension, Rank, CreatedDate, VerifiedDate, FCTH, SHA1, Active)
        VALUES (tp.ProductNumberID, tp.Code, tp.Extension, tp.Rank, getdate(), getdate(), tp.FCTH, tp.SHA1, 0)
        OUTPUT inserted.NumberID as PhotoNumberID, inserted.ProductNumberID, inserted.SHA1, inserted.Rank INTO InsertedPhotos;

這樣我就懂了,insert和update是完整的自語句,可以把聯表後面的條件加到這裏,那麼我的sql就應該是:

merge into service_parameter a
using osb_service_info b on (a.service_code = b.osb_service_code  )
when matched then update set a.service_version=b.osb_service_version where a.service_version != b.osb_service_version

原問題路徑
來自stackoverflow

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章