DELETE FROM Table1 WHERE EXISTS ( SELECT * FROM Table2)
говорит об удалении строки, если exists(SELECT * FROM Table2)
имеет значение true. Если в таблице 2 есть какие-либо строки, это будет истина, и все строки будут удалены.
Вместо этого необходимо указать, какие столбцы в таблице1 должны совпадать с какими столбцами таблицы2. Это должны быть все столбцы, которые вы использовали при вставке / выборе в коррелированном подзапросе .
delete from table1
where exists(
select 1 from table2
where table1.column1a = table2.column1b
and table1.column2a = table2.column2b
and table1.column3a = table2.column3b
)
. Это не приведет к отмене вставки / выбора со 100% точностью. table1 и table2, возможно, изменились. В таблице table1 могут быть строки, которые соответствуют строкам таблицы table2, но не были добавлены вашей вставкой / выбором.
Если у вас есть столбец метки времени, в котором указано время создания строки, вы также можете использовать его для избегайте удаления строк, которые просто совпадают с шаблоном.
delete from table1
where exists(
select 1 from table2
where table1.column1a = table2.column1b
and table1.column2a = table2.column2b
and table1.column3a = table2.column3b
) and
created_at >= [time when you did the insert]
Попробуйте .
Вы также можете определить диапазон rowids которые были затронуты и используют это. Например, если вы определите, что строки с 50 по 100 были добавлены вашей вставкой / выбором ...
delete from table1
where rowid between 50 and 100
Конечно, сделайте это в транзакции, чтобы вы могли выполнить откат в случае ошибки.