#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
) в качестве примера.
Ответ №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, я знаю, но я пытался понять, как я могу применить это к своему коду