2015-11-03 185 views
0

我需要幫助來嘗試更新具有多個重複記錄的表,但我被卡住了。只更新SQL Server中重複條目的第一條記錄

我有這張表,我需要更新im_cust9alt_item_id1值。

我使用來從表中該結果的查詢如下:

SELECT 
    o.item_id, o.alt_item_id1, o.im_cust9, o.owner_id, o.if_updatestamp 
FROM 
    item_master o 
INNER JOIN 
    (SELECT 
      alt_item_id1, COUNT(*) AS dupeCount 
     FROM 
      item_master 
     WHERE 
      owner_id = 'GIII' AND alt_item_id1 <> '' 
     GROUP BY 
      alt_item_id1 
     HAVING 
      COUNT(*) > 1) oc ON o.alt_item_id1 = oc.alt_item_id1 
WHERE 
    owner_id = 'GIII' AND o.alt_item_id1 <> '' 
ORDER BY 
    alt_item_id1, if_updatestamp ASC 

不知道如何更新每個組副本alt_item_id1的最古老的記錄

我使用SQL Server 2012

enter image description here

任何幫助,不勝感激!

+0

所以你實際上並不具有重複行 - 只是alt_item_id1中相同owner_id的重複值,是否正確?你想更新im_cust9爲那些具有相同的alt_item_id所有行最低if_updatestamp的item_id? – Jan

+0

@janschweizer正確! – user2797021

+0

[更新SQL Server表中所有除重複記錄之一以外的所有記錄](http://stackoverflow.com/questions/25090008/update-all-but-one-of-duplicate-records-in-table-in -sql-server) –

回答

0

要獲取最新的行更新,請使用if_updatestamp的最大值。爲最老的使用最小值。然後,它加入到你的表像這樣的UDPATE ...

update IM 
Set IM.im_cust9 = NewDupeRow.alt_item_id1 
From item_master IM 
JOIN ( 
SELECT alt_item_id1,Max(if_updatestamp) MaxUpdateValue 
FROM item_master WHERE owner_id='GIII' AND alt_item_id1<>'' 
GROUP BY alt_item_id1) NewDupeRow 
On IM.alt_item_ID = NewDupeRow.alt_item_ID 
AND IM.if_updatedstamp = NewDupeRow.MaxUpdateValue 
+0

謝謝,這個解決了我的問題..! – user2797021

0

可以使用可更新的CTE和row_number()做到這一點:

with toupdate as (
     select i.*, 
      row_number() over (partition by alt_item_id order by if_updatestamp) as seqnum 
     from item_master i 
    ) 
update toupdate 
    set im_cust9 = alt_item_id1 
    where seqnum = 1; 
相關問題