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

问题描述 投票:1回答:3

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

和代码:

MERGE INTO (select id_car_bk, car_brand_bk, car_type_bk, new_car from car_catalog_backup) A
USING (SELECT id_car, car_brand, car_type FROM car_catalog) B
ON ( A.id_car_bk = b.id_car)
WHEN NOT MATCHED THEN INSERT (A.id_car_bk, A.car_brand_bk, A.car_type_bk)
VALUES (B.id_car, B.car_brand, B.car_type)
WHEN MATCHED THEN UPDATE SET A.car_brand_bk=B.car_brand;
sql oracle sql-delete dml
3个回答
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


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

0
投票

使用左连接:

DELETE target 
FROM target LEFT JOIN source 
ON target.someid = source.otherid 
WHERE source.otherid IS NULL;
© www.soinside.com 2019 - 2024. All rights reserved.