如何在匹配或不匹配时更新源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
我有 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