2014-01-05 2 views
0

Я ищу SQL-запрос для обновления столбца до того же идентификатора для каждого дубликата в другом столбце, а затем удалить каждую перезаписанную строку из другой таблицы.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 

Мне также нужно записать перезаписаны PRODUCTID значения, так что я могу удалить эти строки в другой таблице (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 so '; с cte (...) UPDATE t SET t.ProductId = c.ProductId от cte c right external join @table t \t на c.externalid = t.ExternalId ' Но ответ еще не завершен до удаления других записей – parliament

Смежные вопросы