merge intoに条件判定を加える


merge intoを使用して、2枚のテーブルの比較を行い、条件が合えば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から