2012-01-27 33 views
0

我是SQL新手,试图实现某些功能。保留一行的所有版本,只将其中一个标记为当前版本

我也有像字段的表:

 
CustId Fname Lname Address1 Address2 Zip State LoadDate Flag 
1  John  Leo  xxx  xxx  34532 VA 1/1/2012 Y 
2  Mike  Saunder xxx  xxx  94090 CA 1/1/2012 Y 

每次我插入一个新的记录,将其标志设置为Y,但可以说,如果任何的记录值的变化则新的将被设置为标志Y和旧的N。例如,如果Mikes address1已更改。

 
CustId Fname Lname Address1 Address2 Zip State LoadDate Flag 
1  John  Leo  xxx  xxx  34532 VA 1/1/2012 Y 
2  Mike  Saunder xxx  xxx  94090 CA 1/1/2012 N 
3  Mike  Saunder rrr  xxx  94090 CA 2/1/2012 Y 
+3

这两个Mikes不应该有相同的CustomerID吗? – 2012-01-27 23:19:26

+0

“我是SQL新手,想要实现某些目标。”那么你想达到什么样的目的呢? – 2012-01-27 23:25:52

+0

问题是什么? – 2012-01-27 23:26:58

回答

1

假设你想说的是,FNAME/L-NAME对是唯一的关键,让你匹配的行:

declare @Folks as table (CustId int, Fname varchar(10), Lname varchar(10), 
    Address1 varchar(10), Address2 varchar(10), 
    Zip varchar(9), State varchar(2), LoadDate date, Flag char(1)) 
insert into @Folks (CustId, Fname, Lname, Address1, Address2, Zip, State, LoadDate, Flag) values 
    (1, 'John', 'Leo', 'xxx', 'xxx', '34532', 'VA', '1/1/2012', '-'), 
    (2, 'Mike', 'Saunder', 'xxx', 'xxx', '94090', 'CA', '1/1/2012', '-'), 
    (3, 'Mike', 'Saunder', 'rrr', 'xxx', '94090', 'CA', '2/1/2012', '-') 

-- Before setting the Flag. 
select * from @Folks 

-- Computing a flying flag rather than using a stored value. 
select *, case when LoadDate = (select MAX(LoadDate) from @Folks as S where S.Fname = O.Fname and S.Lname = O.Lname) then 'Y' else 'N' end as 'FlyingFlag' 
    from @Folks as O 

-- Updating all stored values. Every bloody row. 
update @Folks 
    set Flag = case when LoadDate = (select MAX(LoadDate) from @Folks as S where S.Fname = O.Fname and S.Lname = O.Lname) then 'Y' else 'N' end 
    from @Folks as O 

-- Showing the result. 
select * from @Folks 

编辑: 我仍然认为这不是你想要走的方向。例如,除非您依赖CustId作为决胜手,否则它不会优雅地适应每位客户每天更新的更新。

一个稍微好一点的解决方案是用第一行中为客户的NULL值替换Flag,并在后面的行中包含被取代的行的CustId。这将每个客户的变化链接在一起,并在客户在单一日期重复更新的情况下提供定义明确的订单。

0

我假设custid是自动递增的标识列。

update table set flag="N" where CustId= (insert Mike's current CustId here); 

然后

insert into table(Fname, Lname, Address1, Address2, Zip, State, LoadDate, Flag) 
values(Mike, Saunder, rrr, xxx, 94090, CA, 2/1/2012, Y); 
+0

感谢您的回答Isaac ..question,如果我有数百万记录我如何更新表格因为你的问题中的查询将更新为只有迈克的记录(纠正我,如果我错了) – user1174547 2012-01-28 00:06:44

相关问题