У меня есть две таблицы с одинаковым количеством столбцов без первичных ключей (я знаю, это не моя ошибка). Теперь мне нужно удалить все строки из таблицы A, которые существуют в таблице B (они равны, каждая из которых содержит 30 столбцов).УДАЛИТЬ С INTERSECT
Самое непосредственное, что я думал сделать INNER JOIN
и решить мою проблему. Но условия записи для всех столбцов (беспокоиться о NULL
) не изящны (может быть, мои таблицы тоже не изящны).
Я хочу использовать INTERSECT
. Я не знаю, как это сделать? Это мой первый вопрос:
Я попытался (SQL Fiddle):
declare @A table (value int, username varchar(20))
declare @B table (value int, username varchar(20))
insert into @A values (1, 'User 1'), (2, 'User 2'), (3, 'User 3'), (4, 'User 4')
insert into @B values (2, 'User 2'), (4, 'User 4'), (5, 'User 5')
DELETE @A
FROM (SELECT * FROM @A INTERSECT SELECT * from @B) A
Но были удалены все строки из таблицы @A
.
Это привело меня ко второму вопросу: почему команда DELETE @A FROM @B
удаляет все строки из таблицы @A
?
Если я хорошо помню, делая DELETE FROM A B ничего не ограничивает, и это нормально, что она удаляет все. вы можете ограничить, выполнив что-то вроде: УДАЛИТЬ ОТ B, где A.value = B.Value Добавление FROM после удаления является вроде LEFT JOIN – Xavier
Вы имели в виду 'DELETE A', и это не запускается. Прямо сейчас вы удаляете @A CROSS JOIN (что-то еще). Который удаляет все, если в чем-то еще есть хотя бы одна строка. Посмотрите на план запроса, чтобы увидеть это. – usr