2012-01-24 80 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 
相关问题