所以,我有两个表,目标表和源表。我需要删除目标表中存在的行,但源表中不存在。
和代码:
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;
您可以使用
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
)作为示例。
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;