2011-11-01 3 views
2

나는 괜찮은 SQL 프로그래머라고 생각합니다. 그러나 나는 해결할 수있는 우아한 해결책을 찾을 수없는 상황에 처했습니다. 내 데이터베이스에는 두 개의 테이블 tmp_media 테이블과 tbInventoryMedia 테이블이 있습니다. tmp_media 테이블에없는 tbInventoryMedia에서 모든 미디어를 삭제하려고합니다. 그러나 VIN이라는 별개의 열이 있습니다. 일부 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의 자동차 등록은 mediaId가 34131.

마지막으로, tmp_media이 만, 모든 빈스의 완전한 목록을 포함하지 않는 곳 삭제 될 것이라고 최근에 처리되었습니다. 따라서 tbInventoryMedia에는 ​​다른 미디어가 남겨져 있어야합니다. tmp_media 테이블에있는 VIN 만 데이터를 제거해야합니다.

추가 설명이 필요하면 알려주세요. 매우 혼란 스럽습니다.

+2

"tmp_media에는 ​​모든 VIN의 목록이 포함되어 있지 않습니다. 최근 처리 된 목록 만 포함되어 있으므로 tbInventoryMedia에 다른 미디어가 있어야합니다." 두 미디어 모두 tmp_media 테이블에서 누락 될 때 삭제해야 할 미디어와 삭제해야 할 미디어를 어떻게 구분할 것입니까? –

+0

tmp_media에없는 VIN이있는 미디어는 삭제하면 안됩니다. 이 시스템은 상당히 복잡하고 대량의 자동차를 처리하며 한 번에 한 두 사람 만 업데이트됩니다. 업데이트가 완료되면 자동차는 미디어 처리를 위해 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을 위해 일부 데이터를 추가했습니다. 이 예에서는 X, 32131 만 제거됩니다.

+0

답변 해 주셔서 감사합니다. –

관련 문제