获取先前记录的总数
Posted
技术标签:
【中文标题】获取先前记录的总数【英文标题】:Get the total number of previous records 【发布时间】:2014-05-05 06:07:43 【问题描述】:我正在 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 |
-------------------------------
我什至不知道如何尝试解决这个问题,所以我在这里问。
【问题讨论】:
Ordinal_Number
不是简单的id - 1
有什么原因吗? (之前的评论是 =
而不是 -
。)
@GordonLinoff:不,没有。我认为置零会更好地解释我的问题。
【参考方案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
【讨论】:
This question 似乎解释了我的问题... 对,如果你使用get4,你不能在你的更新语句中执行联合查询 以防万一,我已经用替代连接子句编辑了查询。看看它是否有效。但最有可能的是,编译器会将子查询视为相关 你必须在语句的末尾添加 commit :) 即,在你执行完所有内容之后,单独运行 commit;以便将所有更改添加到表中 我尝试在您的查询末尾添加; commit;
,但出现错误。我做错了什么???【参考方案2】:
为了开始谈论从以前的记录中获取值, 您必须在表格的上下文中定义“以前”的含义。为了 大多数情况下,Access 将表视为“一大袋记录”,没有 定义的顺序——最具体地说,记录本身并不是按顺序排列的 进入顺序。在任何你想谈论“以前”或 “下一个”记录,您必须指定记录的排序顺序 - 对于 例如,在查询的 ORDER BY 子句中。并且该排序顺序必须是 根据记录中的数据定义。
如果您需要按输入顺序处理记录,那么您需要有一个 记录中设置为 Now() 的日期/时间字段 进入。如果您的记录具有连续的自动编号主键,则 In 在仔细限制的情况下,您可以使用该关键字段作为 进入顺序的指标。但是,并非所有表都使用自动编号 键,即使在那些键中,自动编号也可以变得随机,而不是 连续的,在某些情况下。所以如果你关心进入 序列,你真的应该使用日期/时间字段来存储 信息。
一旦你建立了一个可以用来确定序列的字段 的记录,您实际上并不需要将当前库存总量存储在 任何记录。它总是可以通过将 通过当前记录输入的所有记录的交易数量。 在某些情况下,为了提高效率而存储它可能很有用,但是 例如,如果有人修改了数据,则存在数据不一致的风险 较早的记录之一,无需重新计算所有后续记录的总数 记录。所以我不建议存储这个计算出来的数据,除非你发现 你真的需要。
【讨论】:
我将自动编号作为从 1 开始的主键。问题是删除记录。如果我从上面删除第二条记录,我将有1
和 3
作为 ID。因为我需要显示记录的序号,所以我决定添加一个新字段,然后用以前的记录数 + 1 填写它。【参考方案3】:
序数以0
开头,所以我会这样做:
update Original
set Ordinal_Number = (select count(*)
from Original as o2
where o2.ID <= original.ID
) - 1;
【讨论】:
它没有用。让我首先澄清一下:我正在 MS Access 中的查询的 SQL 视图 中复制此查询。运行后,会弹出一个对话框提示我输入o2.ID
的值。在我这样做之后,只会弹出相同的对话框,要求输入o.ID
。输入数字后,我收到错误操作必须使用可更新查询,这让我认为我遇到的问题在this question 中描述。关于如何解决它的任何想法?感谢您的回复。以上是关于获取先前记录的总数的主要内容,如果未能解决你的问题,请参考以下文章