#sql #sql-server
#sql #sql-server
Вопрос:
Я чувствую, что я приличный программист SQL; однако я столкнулся с ситуацией, для решения которой, похоже, не могу найти элегантного решения. В моей базе данных есть две таблицы: таблица tmp_media и таблица tbInventoryMedia. Я хочу удалить все носители из tbInventoryMedia, которых нет в таблице tmp_media. Однако существует отдельный столбец с именем VIN — некоторые VIN могут иметь те же носители, что и другие.
Пример:
tmp_media
Vin MediaId
X 20223
Y 54235
Z 20223
tbInventoryMedia
vin MediaId
X 20223
X 32131
Y 54235
Z 20223
В приведенном выше примере vin X будет удален, где MediaID равен 34131.
Наконец, tmp_media не содержит исчерпывающего списка всех VIN, только те, которые были недавно обработаны. Таким образом, в tbInventoryMedia будут другие носители, которые нужно оставить в покое. Только VIN, которые расположены в таблице tmp_media, должны удалять какие-либо данные.
Если требуется дополнительное разъяснение, дайте мне знать — я полагаю, что это очень запутанно.
Комментарии:
1. Вы заявляете: » tmp_media не содержит исчерпывающего списка всех VIN, только те, которые были недавно обработаны. Таким образом, в tbInventoryMedia будут другие носители, которые нужно оставить в покое «. Как бы вы отличили носитель, который следует удалить, от носителя, который следует оставить в покое, когда оба будут отсутствовать в таблице tmp_media?
2. Если носитель имеет VIN, которого нет в tmp_media, его не следует удалять. Система довольно сложная, мы обрабатываем огромное количество машин, и только пара обновляется одновременно. Когда они обновляются, автомобили помещаются в таблицу tmp_media для обработки мультимедиа. Иногда изображение обновленного автомобиля может быть удалено, поэтому этот процесс проверяет, что изображения, больше не привязанные к автомобилю, удалены из базы данных.
Ответ №1:
Это должно проиллюстрировать мое отношение к вашим требованиям:
create table #tmp_media (VIN char(1), MediaID int)
create table #tbInventoryMedia (VIN char(1), MediaID int)
insert #tmp_media
select Vin = 'X', MediaId=20223
union select 'Y', 54235
union select 'Z', 20223
insert #tbInventoryMedia
select vin = 'X', MediaId = 20223
union select 'X', 32131
union select 'Y', 54235
union select 'Z', 20223
union select 'A', 20223
union select 'A', 12345
select * from #tbInventoryMedia
delete im
from
#tbInventoryMedia im
join (select distinct VIN from #tmp_media) as uq on uq.VIN = im.VIN
left join #tmp_media m on m.MediaID = im.MediaID and m.VIN = im.VIN
where m.MediaID is null
select * from #tbInventoryMedia
drop table #tmp_media
drop table #tbInventoryMedia
Я добавил некоторые данные для VIN «A», которые, как я полагаю, следует оставить в покое. В этом примере удаляется только X, 32131