如果记录存在于目标中但不存在于源中,我需要删除它

If the record exists in target but doesn't exist in source, i need to delete it

所以,我有两个 table,目标 table 和源 table。我需要删除目标 table 中存在但源 table 中不存在的行。

代码:

MERGE INTO (SELECT id_car_bk, car_brand_bk, car_type_bk, new_car
              FROM car_catalog_backup) CB
USING (SELECT id_car, car_brand, car_type FROM car_catalog) C
ON (CB.id_car_bk = b.id_car)
WHEN NOT MATCHED THEN
  INSERT
    (CB.id_car_bk, CB.car_brand_bk, CB.car_type_bk)
  VALUES
    (C.id_car, C.car_brand, C.car_type)
WHEN MATCHED THEN
  UPDATE SET CB.car_brand_bk = C.car_brand;
Delete from target
Where not exists 
( 
    Select 1
    From source 
    Where join of source and target
)

左连接:

DELETE target 
FROM target LEFT JOIN source 
ON target.someid = source.otherid 
WHERE source.otherid IS NULL;

您可以使用

DELETE car_catalog_backup b 
 WHERE not exists 
        ( SELECT 0
            FROM car_catalog c 
           WHERE b.id_car_bk = c.id_car );

DELETE car_catalog_backup b 
 WHERE b.id_car_bk not in 
        ( SELECT c.id_car
            FROM car_catalog c );

假设 car_catalogthe sourcecar_catalog_backupthe target。第一个更好,因为它的性能更高。

如果您的目标是通过与您的情况相似的 MERGE 语句找出答案,则使用以下

MERGE INTO car_catalog_backup a
USING (SELECT id_car, car_brand, car_type, car_brand_bk 
         FROM car_catalog
         JOIN car_catalog_backup
           ON id_car_bk = id_car
         ) b
   ON (a.id_car_bk = b.id_car)
 WHEN MATCHED THEN
   UPDATE SET a.new_car = 1
   DELETE
   WHERE a.car_brand_bk != b.car_brand 
 WHEN NOT MATCHED THEN
   INSERT
    (id_car_bk, car_brand_bk, car_type_bk)
   VALUES
    (b.id_car, b.car_brand, b.car_type)

以删除匹配id列(a.id_car_bk = b.id_car)但不匹配brand code列(a.car_brand_bk != car_brand)的记录为例。

Demo