У меня есть две таблицы с одинаковым количеством столбцов без первичных ключей (я знаю, что это не моя вина). Теперь мне нужно удалить все строки из таблицы A, которые существуют в таблице B (они равны, каждая с 30 столбцами).
Самый быстрый способ, который я подумал, это сделать 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 A
, и это не запускается. Прямо сейчас вы удаляете @A CROSS JOIN (что-то еще). Который удаляет все, если есть хотя бы одна строка в чем-то еще. Посмотрите на план запроса, чтобы увидеть это. - person usr   schedule 24.06.2015