2011-11-01 91 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

感謝您的回覆! –