保留一行的所有版本,仅将一个标记为当前版本

时间:2012-01-27 23:15:51

标签: sql sql-server-2008 tsql

我是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而旧标记将设置为{{1} }}。例如,如果Mikes N被更改。

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

2 个答案:

答案 0 :(得分:1)

假设您试图说Fname / Lname对是一个允许您匹配行的唯一键:

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作为平局,否则它不能优雅地容纳每个客户每天更新一次。

稍微好一点的解决方案是将Flag替换为客户第一行中为NULL的PreviousId字段,后续行中包含正在被取代的行的CustId。这将每个客户的更改链接在一起,并在客户在单个日期重复更新时提供明确定义的订单。

答案 1 :(得分: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);