【问题标题】:How to update source table when matched or not matched?匹配或不匹配时如何更新源表?
【发布时间】:2021-08-10 03:08:46
【问题描述】:

我有 2 个表,我的目标是当我上传文件时(文件包含多个数据)我已经在表历史记录中插入文件数据,第一步是我想将历史记录表与名为 EDC 表的表进行比较,如果上传的文件包含 EDC 中存在的数据,然后更新历史记录表(历史记录表包含列 isExist)如果匹配我想更新历史记录,如果不匹配我想将列 isExist 更新为 0

MERGE EDC AS trgt
USING (SELECT kcndh.Nomor_Kartu_Kredit,kcndh.Nama_CardHolder, kcndh.IsExistEDW FROM History kcndh WHERE kcndh.nama_file = '1233.csv')S
ON trgt.Nomor_Kartu_Kredit = Nomor_Kartu_Kredit AND trgt.Nama_Pemegang_Kartu = Nama_CardHolder
WHEN MATCHED THEN
    UPDATE SET
        S.IsExistEDW = 1
WHEN NOT MATCHED THEN
    UPDATE set
        S.IsExistEDW = 0;

我有错误

在 MERGE 语句的“WHEN NOT MATCHED”子句中不允许使用“UPDATE”类型的操作。

有什么方法可以在不使用合并的情况下进行比较和更新,或者如何在不将历史表中的上传值与 EDC 表一一比较的情况下实现我的目标?

【问题讨论】:

  • “NOT MATCHED”的定义意味着没有找到匹配的行......所以没有要更新的行。您需要显示一些示例数据和所需结果以进一步阐明您的需求,因为我不清楚。
  • 如果行不匹配我想更新源表,可以使用合并吗?
  • 不能用合并更新源表,只能更新目标表。
  • 您的源表和目标表是否被颠倒了?

标签: sql sql-server tsql sql-merge


【解决方案1】:

正如 cmets 中已经指出的,您只能使用 MERGE 语句更新目标表(而不是源表)。

但是,您可以使用简单的UPDATE 语句来做到这一点(不需要MERGE 语句):

UPDATE History SET IsExistEDW=CASE WHEN EXISTS (
        SELECT * FROM EDC e
        WHERE e.Nomor_Kartu_Kredit = h.Nomor_Kartu_Kredit 
        AND e.Nama_Pemegang_Kartu = h.Nama_CardHolder
    ) THEN 1 ELSE 0 END
FROM History h
WHERE h.nama_file = '1233.csv'

【讨论】:

    【解决方案2】:

    您可以使用左连接来检查另一个表的存在。

    update History 
    set    IsExistEDW = case when kcndh.Nomor_Kartu_Kredit is null then 0 else 1 end
    from   History kcndh
           left join EDC trgt
           on trgt.Nomor_Kartu_Kredit = kcndh.Nomor_Kartu_Kredit 
           and trgt.Nama_Pemegang_Kartu = kcndh.Nama_CardHolder
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      相关资源
      最近更新 更多