Если запись существует в цели, но не существует в источнике, мне нужно удалить ее - PullRequest
2 голосов
/ 28 марта 2019

Итак, у меня есть две таблицы: целевая и исходная.Мне нужно удалить строки, которые существуют в целевой таблице, но не существуют в исходной таблице.

И код:

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;

Ответы [ 3 ]

0 голосов
/ 28 марта 2019

с левым соединением:

DELETE target 
FROM target LEFT JOIN source 
ON target.someid = source.otherid 
WHERE source.otherid IS NULL;
0 голосов
/ 28 марта 2019

Вы можете использовать

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_catalog равно the source, а car_catalog_backup равно the 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) в качестве примера.

Демо

0 голосов
/ 28 марта 2019
Delete from target
Where not exists 
( 
    Select 1
    From source 
    Where join of source and target
)
...