Использование DELETE FROM
:
SELECT *
INTO #temp
FROM TableA; -- to get the same data to compare with second DELETE
DELETE t
FROM TableA t
WHERE EXISTS(SELECT Id,Name,Salary
FROM TableB
INTERSECT
SELECT t.ID, t.Name, t.Salary);
DELETE t
FROM TableB t
WHERE EXISTS(SELECT Id,Name,Salary
FROM #temp
INTERSECT
SELECT t.ID, t.Name, t.Salary);
SELECT * FROM TableA;
SELECT * FROM TableB;
LiveDemo
Выход:
TableA:
╔════╦═══════╦════════╗
║ Id ║ Name ║ Salary ║
╠════╬═══════╬════════╣
║ 3 ║ TEST3 ║ 300 ║
╚════╩═══════╩════════╝
TableB:
╔════╦═══════╦════════╗
║ Id ║ Name ║ Salary ║
╠════╬═══════╬════════╣
║ 4 ║ TEST4 ║ 400 ║
╚════╩═══════╩════════╝
EDIT:
Чтобы избежать справляясь Целой таблицей использования OUTPUT
положения;
CREATE TABLE #temp(ID INT, NAME VARCHAR(100), Salaray INT);
DELETE t
OUTPUT deleted.Id, deleted.Name, deleted.Salary
INTO #temp
FROM TableA t
WHERE EXISTS(SELECT Id,Name,Salary
FROM TableB
INTERSECT
SELECT t.ID, t.Name, t.Salary);
DELETE t
FROM TableB t
WHERE EXISTS(SELECT Id,Name,Salary
FROM (SELECT Id,Name,Salary FROM TableA
UNION ALL
SELECT Id,Name,Salary FROM #temp) AS sub
INTERSECT
SELECT t.ID, t.Name, t.Salary);
LiveDemo2
Чтобы избежать удаления проблем (срубы роста, TempDb давления и так далее) можно обрабатывать данные, используя 100k куска каждый. Добавьте WHILE LOOP
с 2 переменными @range_start, @range_stop
и приращением на 100 тыс. Или любым другим значением, которое подходит вашей системе.
Similiar: только id или все поля? Что, если 'TableB' имеет' 1 TEST1 101'? – lad2025
Должно быть все поля –
@RajuVadnala - Mysql <> Сервер Sql, который вы используете –