【问题标题】:Keeping all versions of a row, marking only one as current保留一行的所有版本,仅将一个标记为当前版本
【发布时间】:2012-01-28 11:33:08
【问题描述】:

我是 SQL 新手,正在努力实现一些目标。

我有一个包含以下字段的表格:

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

每次我插入一条新记录时,它都会将其标志设置为Y,但如果有任何记录值发生更改,则新记录将设置为标志Y,旧记录设置为N。例如,如果 Mikes address1 被更改。

CustId Fname Lname Address1 Address2 Zip State LoadDate Flag 1 John Leo xxx xxx 34532 VA 1/1/2012 是 2 迈克桑德 xxx xxx 94090 CA 1/1/2012 N 3 Mike Saunder rrr xxx 94090 CA 2/1/2012 是

【问题讨论】:

  • 这两个麦克不应该是同一个CustomerID吗?
  • “我是 SQL 新手,正在努力实现一些目标。”那么你想达到什么目标,问题是什么?
  • @ypercube 我打算在我的回答中提出同样的建议,但决定保持简单。看起来这是他的客户表,并且正在记录更改。我不喜欢它,但我给出的解决方案应该适用于他的架构。
  • 您似乎正在实施行审核,有据可查的方法可以做到这一点(包括 SO stackoverflow.com/questions/603699/… 上的一种),所以我会研究这些而不是实施新的东西。

标签: sql sql-server-2008 tsql


【解决方案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 替换为 PreviousId 字段,该字段在客户的第一行中为 NULL,在后面的行中包含正在被取代的行的 CustId。这将每个客户的更改链接在一起,并在客户在同一日期重复更新的情况下提供明确定义的订单。

【讨论】:

    【解决方案2】:

    我假设 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);
    

    【讨论】:

    • 感谢您的回答 Isaac..question,如果我有数百万条记录,我该如何更新表格,因为您问题中的查询只会更新 Mike 的记录(如果我错了,请纠正我)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2021-06-18
    • 2022-10-15
    相关资源
    最近更新 更多