[英]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_Number
, Salyear
, Salmonth
的組合來更新列,以及匹配發生的地方, 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;
該查詢應該合並目標表中的多個行。
您在MERGE
的UPDATE
部分不需要WHERE
條件,它由ON
條件處理。 WHEN MATCHED
語句僅對匹配行執行 - 因此MEMBER_NUMBER
, SALYEAR
和SALMONTH
在源和目標之間的行相同。
讓我們假設源 - 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.