2012-01-24 122 views
0

我需要以下查詢的幫助。根據同一表中的字段更新oldID字段

create table #table1 
(id int not null primary key identity, 
customer_name varchar(25), 
usage float, 
oldID int null 
) 


insert into #table1 values('ABC',46.5,null) 
insert into #table1 values('ABC',46.5,null) 
insert into #table1 values('DEF',36.8,null) 
insert into #table1 values('XYZ',50.1,null) 
insert into #table1 values('DEF',36.8,null) 
insert into #table1 values('XYZ',50.1,null) 

select * from #table1 

我希望我的表進行更新,這樣

id   customer_name    usage     oldID 
----------- ------------------------- ---------------------- ----------- 
1   ABC      46.5     NULL 
2   ABC      46.5     1 
3   DEF      36.8     NULL 
4   XYZ      50.1     NULL 
5   DEF      36.8     3 
6   XYZ      50.1     4 
  1. 兩個記錄具有相同的名稱和使用率就是後來的紀錄被更新。
  2. 在新記錄中,oldID字段應指向其舊記錄(ID)。

雖然在我的實際表中,我有一堆日期字段,我可能可以使用,但這會幫助我現在。

+0

+1的樣本數據準備測試。 – danihp

回答

0

隨着CTE,沒有subquerys,有幾行僅更新客戶:

with cte as (
    select customer_name, min(id) as id 
    from #table1 
    group by customer_name 
    having count(*) > 1 
) 
update #table1 
set oldID = cte.id 
from cte 
where #table1.customer_name = cte.customer_name 
and #table1.id != cte.id 
+0

這兩個答案的工作,這一個更清楚。 –

1

試試這個使用CTE:

;WITH data AS 
(
    SELECT 
     id, customer_name, 
     OldID = (SELECT MIN(id) FROM #table1 t2 WHERE t2.customer_name = t.customer_name) 
    FROM #table1 t 
) 
UPDATE #table1 
SET OldID = data.OldID 
FROM Data 
WHERE 
    data.customer_Name = #table1.customer_name 
    AND #table1.ID <> data.oldid 

select * from #table1 

Data CTE基本上只是確定最小ID爲每一個客戶,如果客戶的ID是不是最小的ID,然後OldID設置爲ID值。

當我運行它,我得到一個輸出結果:

id customer_name usage oldID 
1 ABC   46.5 NULL 
2 ABC   46.5 1 
3 DEF   36.8 NULL 
4 XYZ   50.1 NULL 
5 DEF   36.8 3 
6 XYZ   50.1 4 
相關問題