2011-11-01 93 views
2

我觉得自己是一位体面的SQL程序员;然而,我遇到了一个我似乎无法找到一个优雅的解决方案来解决的情况。我的数据库中有两个表,一个tmp_media表和一个tbInventoryMedia表。我想从tbInventoryMedia中删除tmp_media表中不存在的所有媒体。但是,有一个明显的列VIN--一些VIN可以具有与其他媒体相同的媒体。SQL查询 - 需要优雅的解决方案

实施例:

tmp_media 
Vin MediaId 
X 20223 
Y 54235 
Z 20223 

tbInventoryMedia 
vin MediaId 
X 20223 
X 32131 
Y 54235 
Z 20223 

在上面的例子中,X的VIN将被删除,其中mediaId是34131.

最后,tmp_media不包含所有的VIN的穷举列表,只有那些最近已经处理完毕。因此,tbInventoryMedia将会有其他媒体需要独立。只有位于tmp_media表中的VIN才能删除任何数据。

如果需要进一步说明,请告诉我 - 我想这很混乱。

+2

您声明:“tmp_media没有包含所有VIN的详尽列表,只包含那些最近已经处理过的列表,因此tbInventoryMedia中还有其他媒体需要单独保留。如何区分应该删除的媒体与当tmp_media表中缺少媒体时应该保留的媒体? –

+0

如果媒体的VIN不在tmp_media中,则不应删除。该系统相当复杂,我们处理大量汽车,只有一对夫妇一次更新。当他们更新时,汽车被放入tmp_media表中进行媒体处理。有时更新的汽车可能会删除图像,因此此过程将验证不再与汽车绑定的图像将从数据库中删除。 –

回答

4

这应该说明你的需求我的看法:

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 

我已经添加了一些数据,为“A” VIN,这是我应该beleive被单独留在家中。在这个例子中,只有X, 32131被删除

+0

感谢您的回复! –