如何在插入或更新其他记录时更新所有记录的日期字段?

时间:2015-11-02 15:52:07

标签: sql sql-server

update作为存储过程的一部分运行,insertupdateInformation表中的记录:

UPDATE [Information] SET
    [TermDate] = @aEffDate
WHERE [InformationID] = (SELECT ISNULL(MAX(InformationID),0)
    FROM Information
    WHERE  InformationID <  @aInformationID
    AND [DeletedBy] IS NULL
    AND [DeletedOn] IS NULL
    AND Code = @aCode)

基本上,它会查找第二个最新记录(基于ID)并将该记录TermDate设置为当前记录的EffDate。问题在于,这假定用户以最旧到最新的顺序输入记录。

我已在上面的嵌套select语句中添加了另一个子句,以包含AND EffDate < @aEffDate,这可确保日期不会被正确终止。但是,现在,当null返回的记录具有更大MAX(InformationID)

时,我只有一堆带有EffDate TermDate列的记录

所以,假设以下

1)使用11/02/2015 EffDate输入的记录

2)与2015年9月1日输入的记录EffDate

3)使用10/03/2015 EffDate输入的记录

4)记录于2015年9月15日输入EffDate

数据库看起来会这样:

InformationID    |    EffDate   |    TermDate
---------------------------------------------
      1          |   11/02/15   |    09/01/15
      2          |   09/01/15   |    10/03/15
      3          |   10/03/15   |    09/15/15
      4          |   09/15/15   |      NULL

但它应该是这样的:

InformationID    |    EffDate   |    TermDate
---------------------------------------------
      1          |   11/02/15   |      NULL
      2          |   09/01/15   |    09/15/15
      3          |   10/03/15   |    11/02/15
      4          |   09/15/15   |    10/03/15

用户应该按照2,4,3,1的顺序输入记录,这会为每条记录分配适当的TermDate。但不幸的是,我们无法真正强迫他们这样做。

问题如何让EffDate最接近但不低于另一条记录的EffDate,并将该值指定为另一条记录的TermDate?

我已取消InformationID的支票,只是为了确保它们不相同; InformationID <> @aInformationID但除此之外,我无法弄清楚如何获得最近的&#34;日期。

1 个答案:

答案 0 :(得分:0)

使用窗口函数和可更新的CTE /子查询。作为您问题的正式答案,这应该是倒数第二个记录:

with toupdate as (
      select i.*,
             row_number() over (order by effdate desc) as seqnum
      from Information
      where DeletedBy IS NULL and DeletedOn IS NULL and Code = @aCode
     )
update toupdate
    set TermDate = @aEffDate
    where seqnum = 2;