sql - 如何在合并或更新操作期间比较源表和目标表之间的三个列
问题描述
我有两张桌子,contribution(Member_number,Salyear,Salmonth,ReceiptDate)
和contribution_update(Member_number,Salyear,Salmonth,ReceiptDate)
。Receiptdate
表中的列contribution
具有空值。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;
查询应该合并目标表中的许多行。
解决方案
你不需要那个WHERE
条件,它是由条件处理的。该语句将仅对匹配的行执行 - 因此源和目标之间的行 where和是相同的。UPDATE
MERGE
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
推荐阅读
- javascript - 如何自定义错误文本消息的值 - Mikrotik hotstpot
- c# - 如何显示列表视图行的所有内容
- python - 无法模拟具有超级方法的类
- javascript - 如何使用数组包含并根据对象的属性检查对象
- python - 如何使用 selenium、chrome 驱动程序和 python 关闭新构建的选项卡
- r - 如何根据两列删除所有重复行?
- javascript - WordPress:未捕获的类型错误:$ 不是函数
- php - 如何处理我想插入到我的 dB 的大数据?
- python - Python:将表转换为字符串到键:值对并使用理解存储在嵌套字典中
- c# - 如何在片段类中访问 MainActivity 类的公共成员(变量或方法)