【问题标题】:MS Access Update with Increment of Prior Record增加先前记录的 MS Access 更新
【发布时间】:2011-06-02 15:01:41
【问题描述】:

我有一个需要为其创建更新的 MS Access 2007 数据库。我要更新的表如下所示:

 CarID  WeekOf          NumDataPoints   NumWksZeroPoints
 3AA    May-14-2011     23              0
 7BB    May-14-2011     9               0

 3AA    May-21-2011     35              0
 7BB    May-21-2011     0               1

 3AA    May-28-2011     24  
 7BB    May-28-2011     0   

我正在处理 2011 年 5 月 28 日的最新记录集,要点是更新每辆车没有数据点的周数。我通过检查当前周的点数来做到这一点,如果它确实有一些点,那么#WeeksZeroPoints 设置为零,如果当前的点数为零,那么我采用前几周的计数并加一。在我的最后一周,我会输入

  0
  2

所以我尝试了类似的东西

UPDATE tblCars 
SET NumWksZeroPoints = IIF(NumDataPoints<>0, 0, (SELECT MAX(NumWksZeroPoints) AS wzp 
                                                 FROM tblCars AS f 
                                                 WHERE f.CarID=tblCars.CarID AND 
                                                       f.WeekEnding=#5/21/2011#) + 1
                       )
WHERE WeekOf=#5/28/2011#;

不幸的是,这并没有像我想象的那样工作。我想我已经把这个概念和大部分 SQL 都记下来了,我似乎无法让它工作。这是针对 MS Access 的,所以我知道的其他一些技巧是行不通的。任何帮助表示赞赏。

【问题讨论】:

  • 对问题的支持是下方评论它是“设计锁定”。有时你只需要知道如何以正确的方式做错事......

标签: sql ms-access sql-update record


【解决方案1】:

您可以(并且有些人可能会说应该)将其作为查询来执行,而无需更新表。如果您要捕获每辆车每周的数据点,您的查询可以使用日期数学计算汽车没有数据点的周数。如果有人在您运行更新后插入汽车数据会怎样?您最终会得到不一致的数据。

【讨论】:

  • 这实际上是对我正在使用 .NET 执行的旧 VB6 程序的重写。所以所有的表和字段都必须保持完全相同,否则前端将无法工作。但你确实提出了一个有趣的观点。也许当我继续重写前端时,我会接受建议。数据库本身可能不会以错误的顺序更新。我是唯一一个更新和维护它的人。其他人只是阅读它。但它可能会发生。
【解决方案2】:

使用您的示例数据,我运行了以下操作

UPDATE tblcar AS c 
       INNER JOIN tblcar AS previous 
         ON c.carid = previous.carid 
SET    c.numwkszeropoints = Iif([previous].[NumWksZeroPoints] = 0, 0, 
                                   [previous].[NumWksZeroPoints] + 1) 
WHERE c.weekof =#5/28/2011 # 
         AND previous.weekof =#5/21/2011#;

后来的桌子是这样的

CarID WeekOf     NumDataPoints NumWksZeroPoints
----- ---------- ------------- -----------------
3AA   05/14/2011 23            0
7BB   05/14/2011 9             0
3AA   05/21/2011 35            0
7BB   05/21/2011 0             1
3AA   05/28/2011 24            0
7BB   05/28/2011 0             2

基本上,查询会自联接回到前一周,如果不为零,则将当前周更新为前一周的值 + 1。

【讨论】:

  • 从来没有以这种方式进行过 UPDATE 查询,但它看起来会起作用。但是,我确实将其稍微调整为 SET c.NumWksZeroPoints = IIF(c.NumDataPoints0, 0, [previous].[NumWksZeroPoints] + 1) 因为更新应该基于本周的数据点数量.我会测试并报告我所看到的。
  • 经过测试,这是我需要做的。非常感谢你的帮助。我每天都在这个论坛上学到新东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2021-04-12
  • 2021-04-17
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多