Если запись существует в target, но не существует в source, мне нужно удалить ее

#sql #oracle #sql-delete #dml #sql-merge

#sql #Oracle #sql-удалить #dml #sql-слияние

Вопрос:

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

И код:

 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;
  

Комментарии:

1. Итак, с какой проблемой вы столкнулись?

2. я не знаю, как удалить эти строки

3. ЕСЛИ ИСХОДНИК НЕ СООТВЕТСТВУЕТ, это идеальный способ, если вы хотите управлять им в рамках СЛИЯНИЯ

Ответ №1:

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

 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 ) в качестве примера.

Demo

Ответ №2:

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

Ответ №3:

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

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

Комментарии:

1. не работает, можете ли вы быть более конкретным или попробовать что-то еще?

2. Это правильный синтаксис для Oracle. Соедините 2 таблицы в общем столбце и удалите строки, которые не совпадают: docs.oracle.com/cd/E17952_01/mysql-5.1-en/delete.html

3. Андрей Г.Х., mr. forpas дал вам ссылку на инструкцию удаления базы данных mysql.

4. akk0rd87, я знаю, но я пытался понять, как я могу применить это к своему коду