Access SQL如何在SELECT查询中进行递增

3
我有一个SQL查询,返回X个结果,我希望查询输出带有一个名为count的列,使查询结果像这样:
count id section
1     15    7
2     3     2
3     54    1
4     7     4

我该如何实现这个?

1
为什么你想要这样做呢?如果你正在读取一组记录,你可以在代码中增加一个变量。 - Geoffrey
我正在为一个学校项目使用Access表单,实际上我是为了以后能够直接获取第三条记录或第五条记录...无论如何,我愿意使用VBA,但我更愿意使用纯SQL。 - fingerman
然后只需使用 LIMIT 子句:SELECT * FROM table WHERE a = b LIMIT 5,1 - Geoffrey
实际上,这里有一对相当可爱的解决方案:http://www.techrepublic.com/blog/msoffice/an-access-query-that-returns-every-nth-record/3617 - Tao
1
@Tao:当你说Access不支持“内联派生表”时,你是指什么?Jet/ACE SQL肯定支持我所说的派生表(在FROM子句中的子查询),而且一直以来都支持。默认语法有点奇怪,但它是有效的。实际上,在当前版本的Access中,如果你使用标准SQL语法输入这个,Access QBE会自动将其转换为自己的方言。 - David-W-Fenton
显示剩余12条评论
7个回答

3
我见过的唯一技巧是,如果你有一个连续的id字段,你可以创建一个新字段,在该字段中每个记录的值为1。然后你可以对该字段进行累加求和。
在你的查询中添加这个操作。
DSum("[New field with 1 in it]","[Table Name]","[ID field]<=" & [ID Field]) 
as counterthing

这应该会在Access中生成一个连续计数,我想这就是你想要的。
希望对你有所帮助。
(摘自Rob Mills的话:http://www.access-programmers.co.uk/forums/showthread.php?p=160386

2

我不太明白你想要什么,但如果你只是想在表单上显示一个序列号,你可以使用绑定到表单的CurrentRecord属性的控件。一个带有ControlSource =CurrentRecord 的控件将具有始终准确的“记录号”,这些记录号是按顺序排列的,并且当表单的Recordsource更改时会更新(这可能是需要的或不需要的)。

然后,您可以使用该编号在表单中导航,如果需要的话。

但这可能与您所寻找的完全不同 - 我无法从您发布的问题和评论中的“澄清”中得出结论。


+1 虽然我不能完全理解你的回答,但我认为它的本质是“更适合前端” :) 附言:我将抵制诱惑,建议使用 MSDataShape 提供程序 APPEND 一个空列,可以在前端代码中填充 ;) - onedaywhen
“记录编号”只在前端环境中有意义,对吗?也就是说,在特定数据集之外,序列没有任何含义。在这种情况下,问题的描述是一个前端问题(尽管从问题本身并不清楚,只有在评论中才表露出来),因此前端解决方案似乎是完全合适的。 - David-W-Fenton
确实,根据定义,关系没有排序。无论是对于Access(ACE,Jet等)的基表内容(在磁盘上具有可预测的物理排序),还是使用INTO子句的SELECT查询结果(我不知道这被称为什么:它不是一个“表”,所以我选择使用结果集),是否可以视为关系,就由您决定了... - onedaywhen
然而,一个表可以有一个记录编号(或开始日期等)属性,并且数据库模式提供了DBMS理解数据的含义,这可以暗示排序。换句话说,语义不仅仅属于前端应用程序。 - onedaywhen

2

在你的例子中,“count”是派生的序列号吗?我不明白为什么要使用什么模式来确定id=15时计数必须为1,而id=3时计数必须为2。

count id section
1     15    7
2     3     2
3     54    1
4     7     4

如果id包含唯一值,并且您按id排序,可能会出现这种情况:
count id section
1     3     2
2     7     4
3     15    7
4     54    1

在我看来,mikeY的DSum方法可能有效。或者您可以像Allen Browne在这个页面中描述的那样使用不同的排名查询方法。

编辑:您可以使用DCount而不是DSum。我不知道两者之间的速度如何比较,但是DCount避免了仅为每行创建一个字段以存储1的表。

DCount("*","YourTableName","id<=" & [id]) AS counter

无论您选择使用DCount还是DSum,如果id值不唯一,则计数器值可能包括重复项。 如果id是主键,则无需担心。

1

好的,我想这足以构成一个答案:以下链接指定了两种方法:http://www.techrepublic.com/blog/microsoft-office/an-access-query-that-returns-every-nth-record/

第一种方法假设您有一个ID值,并使用DCount(类似于@mikeY的解决方案)。

第二种方法假定您可以创建一个VBA函数,该函数将为记录集中的每条记录运行一次,并且每次想要运行计数时都需要手动重置(使用一些VBA),因为它使用“静态”值来运行其计数器。

只要您有合理的数量(百个而不是千个)或记录,第二种方法对我来说看起来是最简单/最强大的。


我最终采用了你在评论中提供的解决方案...这意味着我必须创建一些查询,但这是可以接受的。 - fingerman

0

如果可用,此函数可以从每个记录中调用,来自一个模块。

示例:incrementingCounterTimeFlaged(10, [任何字段]) 应该为您的查询行提供一个从0递增的整数。

'provides incrementing int values 0 to n
'resets to 0 some seconds after first call
Function incrementingCounterTimeFlaged(resetAfterSeconds As Integer,anyfield as variant) As Integer

Static resetAt As Date
Static i As Integer
'if reset date < now() set the flag and return 0

If DateDiff("s", resetAt, Now()) > 0 Then
    resetAt = DateAdd("s", resetAfterSeconds, Now())
    i = 0
    incrementingCounterTimeFlaged = i
'if reset date > now increments and returns
Else
    i = i + 1
    incrementingCounterTimeFlaged = i
End If    
End Function

0

SQL中的自增

SELECT (Select COUNT(*) FROM table A where A.id<=b.id),B.id,B.Section FROM table AS B ORDER BY B.ID Asc

-1
你可以使用在SQL Server 2008中的ROW_NUMBER()函数。
SELECT ROW_NUMBER() OVER (ORDER By ID DESC) RowNum,
    ID,
    Section
FROM myTable

然后RowNum显示行号的顺序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接