SQL-запрос — требуется элегантное решение

#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