获取以前记录的总数

时间:2014-05-05 06:07:44

标签: sql ms-access-2007

我在 MS Access 中创建一个查询,需要使用以前记录的总数更新新创建的字段。像这样:

原始表:

|  ID | Name |
--------------
|  1  | Mark |
--------------
|  2  | Mich |
--------------
|  3  | Isak |
--------------

现在我添加另一列(类型为int),例如Ordinal_Number

|  ID | Name | Ordinal_Number |
-------------------------------
|  1  | Mark |                |
-------------------------------
|  2  | Mich |                | 
-------------------------------
|  3  | Isak |                | 
-------------------------------

现在我需要填写Ordinal_Number以前的记录数:

|  ID | Name | Ordinal_Number |
-------------------------------
|  1  | Mark |       0        |
-------------------------------
|  2  | Mich |       1        | 
-------------------------------
|  3  | Isac |       2        | 
-------------------------------

我甚至不知道如何尝试解决这个问题所以我在这里问。

3 个答案:

答案 0 :(得分:1)

 SELECT a.*, (SELECT COUNT(*) FROM Original_table WHERE a.ID>=ID) as Ordinal_Number
 FROM Original_table as a
 ORDER BY a.ID

更新:

UPDATE Original_table o
set  Ordinal_Number=
(SELECT COUNT(*) FROM Original_table WHERE o.ID>=ID)

或适用于jet4版本

UPDATE Original_table o 
inner join
(SELECT a.*, (SELECT COUNT(*) FROM Original_table WHERE a.ID>=ID) as Ordinal_Number
 FROM Original_table as a
 ORDER BY a.ID) newt
on o.ID=newt.ID
Set o.Ordinal_Number=newt.Ordinal_Number

答案 1 :(得分:0)

为了开始谈论从以前的记录中获取值, 你必须在表的上下文中定义“previous”的含义。对于 大多数用途,Access将表视为“大包的记录”,没有 定义的顺序 - 最具体地说,记录不是固有的排序依据 进入序列。在任何你想谈论“前一个”或 “下一步”记录,您必须为记录指定排序顺序 - for 例如,在查询的ORDER BY子句中。那种排序必须是 根据记录中的数据定义。

如果您需要按照录入顺序处理记录,那么您需要有一个 记录中设置为Now()的记录中的日期/时间字段 进入。如果您的记录具有连续的自动编号主键,则为In 在严格限制的情况下,您可以使用该关键字段作为 进入序列的指标。但是,并非所有表都使用自动编号 密钥,甚至在那些密钥中,自动编号可以变得随机,而不是 在某些情况下连续。所以,如果你关心进入 顺序,你真的应该使用日期/时间字段来存储 信息。

一旦建立了可用于确定序列的字段 记录中,您实际上并不需要存储当前库存总额 任何记录。它总是可以通过累加来计算 通过当前记录输入的所有记录的交易数量。 在某些情况下,为了效率而存储它可能是有用的,但那样做 例如,如果某人修改了数据,则存在数据不一致的风险 其中一个早期的记录没有重新计算所有后续的总数 记录。因此,除非您发现,否则我不建议存储此计算数据 你真的需要。

答案 2 :(得分:0)

序号以0开头,所以我会这样做:

update Original
    set Ordinal_Number = (select count(*)
                          from Original as o2 
                          where o2.ID <= original.ID
                         ) - 1;