2014-01-05 28 views
0

我正在查找SQL查詢以將列更新爲另一列中每個副本的相同Id,然後從另一個表中刪除每個重寫的行。SQL - 其他列中每個副本的更新列

例如

我:

IndustryId  ProductId  ExternalId 
144    3332   13 
147    3423   13 
148    3532   13 
2637   63199   32 
121    2789   32 

我想:

IndustryId  ProductId  ExternalId 
144    3332   13 
147    3332   13 
148    3332   13 
2637   63199   32 
121    63199   32 

我還需要記錄覆蓋產品編號值,這樣我可以在另一個表中刪除這些行( 3423,3532和2789應該在另一個表中刪除)。可能在多個查詢中,如果有必要,那沒關係。

達到此目的的最佳方法是什麼?

回答

1

這並不難,特別是如果你打破了步驟。 檢查了這一點:

if object_id('tempdb..#myData') is not null 
    drop table #myData; 

create table #myData (industryid int, productId int, externalId int); 

insert into #myData (industryId, productId, externalId) 
values (144,3332,13); 
insert into #myData (industryId, productId, externalId) 
values (147,3423,13); 
insert into #myData (industryId, productId, externalId) 
values (148,3532,13); 
insert into #myData (industryId, productId, externalId) 
values (2637,63199,32); 
insert into #myData (industryId, productId, externalId) 
values (121,2789,32); 

         --select * from #myData; 
------------------------------------------------- 
if object_id('tempdb..#IdsToKeep') is not null 
    drop table #IdsToKeep; 
if object_id('tempdb..#badRows') is not null 
    drop table #badRows; 

create table #IdsToKeep (externalId int, productId int); 
create table #badRows (industryId int, productId int, externalId int); 

insert into #IdsToKeep 
select 
    externalId, min(productId) 
from 
    #myData 
group by 
    externalId; 


--- Capture rows that will be changed --- 
insert into #badRows 
select 
    md.industryId, md.productId, md.externalId 
from 
    #myData md 
     left join #IdsToKeep itk on 
          md.externalId = itk.externalId 
          and 
          md.productId = itk.productId 
where 
    itk.productId IS NULL 
; 


--- Make the update to the main table --- 
update 
    #myData 
set 
    productId = itk.productId 
from 
    #myData 
     inner join #IdsToKeep itk on #myData.externalId = itk.externalId 
; 


---------- 
select * from #mydata; 
select * from #badRows; 
0
declare @table table (IndustryId int, ProductId int, ExternalId int) insert into @table values (144,3332,13), (147,3423,13), (148,3532,13), (2637,63199,32), (121,2789,32) 

select * from @table 

;with cte (productid, externalid) as (select max(productid), ExternalId from @table group by ExternalId) select t.IndustryId, c.productid, c.externalid from cte c right outer join @table t on c.externalid = t.ExternalId 
+0

謝謝,這似乎做的第一部分,但有關刪除重寫的ProductId的另一個表是什麼?我需要記錄所有被覆蓋的ProductId(或者在另一個表上直接刪除) – parliament

+0

另外,要麼我不理解查詢,或者實際上並沒有更新第一張表? – parliament

+0

好吧,我得到更新工作liek所以';與cte(...)UPDATE t SET t.ProductId = c.ProductId from cte c right outer join @table t \t on c.externalid = t.ExternalId ' 但是就刪除其他記錄而言,回答仍然不完整 – parliament

相關問題