如何在匹配或不匹配时更新源table?

How to update source table when matched or not matched?

我有 2 个 table,我的目标是当我上传文件时(文件包含多个数据)我已经在 table 历史记录中插入文件数据,第一步是我想将历史 table 与称为 EDC table 的 table 进行比较,如果上传的文件包含 EDC 中存在的数据,则更新历史 table(历史 table 包含列 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;

我收到错误

An action of type 'UPDATE' is not allowed in the 'WHEN NOT MATCHED' clause of a MERGE statement.

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

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

但是,您可以使用简单的 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'

您可以使用左连接来检查是否存在另一个 table。

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