簡體   English   中英

如何在合並或更新操作期間比較源表和目標表之間的三個列

[英]How to compare three colums between source and target tables during merge or update operation

我有兩個表, contribution(Member_number,Salyear,Salmonth,ReceiptDate)contribution_update(Member_number,Salyear,Salmonth,ReceiptDate) 表格contribution的列Receiptdate具有空值。 我想通過比較Member_NumberSalyearSalmonth的組合來更新列,以及匹配發生的地方, Receiptdate會更新。

我編寫了以下代碼,但它合並了o值。

任何有關如何改進或重寫腳本的想法的人。

我開始使用這段代碼

MERGE INTO CONTRIBUTION cgt
USING (select MEMBER_NUMBER,SALYEAR,SALMONTH,RECEIVED_DATE from CONTRIBUTION_UPDATE  )cga
ON (cgt.MEMBER_NUMBER=cga.MEMBER_NUMBER AND cgt.SALYEAR=cga.SALYEAR AND cgt.SALMONTH=cga.SALMONTH)
WHEN matched then
update 
SET cgt.RECEIPTDATE=cga.RECEIVED_DATE;

然后我發現表contribution_update有重復(Gor消息無法獲得穩定的行集......)。 我重新創建了表,沒有重復。

MERGE INTO Contribution M
      USING
      (Select Member_Number,Salyear,Salmonth,ReceiptDate From
(select MEMBER_NUMBER,SALYEAR,SALMONTH,RECEIptDATE,row_number() over (partition by MEMBER_NUMBER,SALYEAR,SALMONTH
 order by null ) as qry from Contribution_update)where qry=1) vu
              ON  (Vu.Member_Number = M.Member_Number and M.Salyear=Vu.Salyear and M.Salmonth=Vu.Salmonth )
  WHEN MATCHED
  THEN
  UPDATE
  SET  M.Receiptdate = Vu.ReceiptDate;
  WHERE M.Salyear=Vu.Salyear and M.Salmonth=Vu.Salmonth;

該查詢應該合並目標表中的多個行。

您在MERGEUPDATE部分不需要WHERE條件,它由ON條件處理。 WHEN MATCHED語句僅對匹配行執行 - 因此MEMBER_NUMBERSALYEARSALMONTH在源和目標之間的行相同。

讓我們假設源 - ContributionUpdate看起來像這樣:

MEMBER_NUMBER SALYEAR     SALMONTH    RECEIVED_DATE
------------- ----------- ----------- -------------
1             2019        1           2019-10-10
2             2019        1           2019-10-20

目標 - 像這樣的Contribution

MEMBER_NUMBER SALYEAR     SALMONTH    RECEIVED_DATE
------------- ----------- ----------- -------------
1             2019        1           NULL

對於成員1,2019年,第1個月,目標中有一個匹配的行。如果您只想從源更新RECEIVED_DATE的匹配年份,這就足夠了:

MERGE INTO Contribution t
USING ContributionUpdate s
   ON s.MEMBER_NUMBER = t.MEMBER_NUMBER
  AND s.SALYEAR = t.SALYEAR
  AND s.SALMONTH = t.SALMONTH

WHEN MATCHED
THEN UPDATE 
 SET RECEIVED_DATE = s.RECEIVED_DATE;

(1 row affected)

如果你還想將一個缺失的行從源插入目標(對於成員2),你需要使用WHEN NOT MATCHED BY TARGET ,如下所示:

MERGE INTO Contribution t
USING ContributionUpdate s
   ON s.MEMBER_NUMBER = t.MEMBER_NUMBER
  AND s.SALYEAR = t.SALYEAR
  AND s.SALMONTH = t.SALMONTH

WHEN MATCHED
THEN UPDATE 
 SET RECEIVED_DATE = s.RECEIVED_DATE

WHEN NOT MATCHED BY TARGET
THEN INSERT
(
   MEMBER_NUMBER,
   SALYEAR      ,
   SALMONTH     ,
   RECEIVED_DATE
)
VALUES
(
   s.MEMBER_NUMBER,
   s.SALYEAR      ,
   s.SALMONTH     ,
   s.RECEIVED_DATE
);

(2 rows affected)

結果, Contribution表將如下所示:

MEMBER_NUMBER SALYEAR     SALMONTH    RECEIVED_DATE
------------- ----------- ----------- -------------
2             2019        1           2019-10-20
1             2019        1           2019-10-10

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM