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

时间:2019-03-28 08:33:38

标签: sql oracle sql-delete dml

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

和代码:

Set up docker on your instance

docker daemon --storage-opt dm.basesize=60G 

3 个答案:

答案 0 :(得分:0)

Delete from target
Where not exists 
( 
    Select 1
    From source 
    Where join of source and target
)

答案 1 :(得分:0)

通过左联接:

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

答案 2 :(得分:0)

您可以使用

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 source,而car_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