Microsoft Access 查询返回序列号
Posted
技术标签:
【中文标题】Microsoft Access 查询返回序列号【英文标题】:Microsoft Access query returning sequential numbers 【发布时间】:2015-09-05 08:42:52 【问题描述】:有没有办法在 MS Access 中创建返回我选择的序列号的查询?例如
10.1
10.2
10.3
10.4
10.5
或
100
90
80
70
60
50
40
30
20
或
2015-04-10 12:00
2015-04-10 13:00
2015-04-10 14:00
2015-04-10 15:00
2015-04-10 16:00
2015-04-10 17:00
2015-04-10 18:00
我可以使用 VBA 创建具有这些值的临时表。我还可以创建自己的 VBA 函数,并将其放入查询中。问题是:这可能与纯 MS Access 查询吗?如果没有,最简单、最快的方法是什么?
编辑:我不必避免使用 VBA,我只想找到简短、干净、高效的代码。
【问题讨论】:
【参考方案1】:您可以使用一个简单的笛卡尔查询,其中包含一个数字从 0 到 9 的表格:
SELECT
t1.Number +
t2.Number * 10 +
t3.Number * 100 +
t4.Number * 1000 As Factor
FROM
tblNumber AS t1,
tblNumber AS t2,
tblNumber AS t3,
tblNumber AS t4
或者 - 如果您只需要小系列 - 只需一个包含 0 到 99 数字的表格。
那么对于您的样本:
SELECT
10 + 0.1 * [Number] AS [Value]
FROM
tblNumber
WHERE
[Number] Between 1 And 5
和:
SELECT
[Number] * 10 AS [Value]
FROM
tblNumber
WHERE
[Number] Between 2 And 10
ORDER BY
[Number] * 10 Desc
和:
SELECT
DateAdd("h", [Number], #2015-04-10 12:00 PM#) AS [Date]
FROM
tblNumber
WHERE
[Number] Between 0 And 6
附录
使用系统表作为源,也可以在没有专用数字表的情况下构建数字系列:
SELECT DISTINCT
[Tens]+[Ones] AS Factor,
10*Abs([Deca].[id] Mod 10) AS Tens,
Abs([Uno].[id] Mod 10) AS Ones
FROM
msysobjects AS Uno,
msysobjects AS Deca;
【讨论】:
似乎用数字制作小桌子是唯一的解决方案。这个答案与来自 shA.t 的答案基本相同,但代码看起来更干净。你们俩都是对的,但这个答案对我来说看起来更好。 不,这不是唯一的解决方案,请参阅附录。【参考方案2】:我认为您可以使用这样的解决方案:
像这样创建一个表(命名为t
):
ID | i
---+---
1 | 0
2 | 1
3 | 2
4 | 3
5 | 4
6 | 5
7 | 6
8 | 7
9 | 8
10 | 9
现在使用这个表来满足你的所有需要,例如从0
到9999
使用这个查询:
SELECT
i1 + i2 * 10 + i3 * 100 + i4 * 1000 AS rowNo
FROM
(SELECT
t1.i AS i1, t2.i AS i2
FROM
t AS t1, t AS t2) AS tt1,
(SELECT
t1.i AS i3, t2.i AS i4
FROM
t AS t1, t AS t2) AS tt2;
例如,您可以将rowNo
公式更改为:
CDbl('10.'+CStr([i1]+[i2]*10+[i3]*100+[i4]*1000)) => 10.1, 10.2, ...
或
(10000 - ([i1]+[i2]*10+[i3]*100+[i4]*1000)) * 10 => 100000, 99990, ... , 20, 10
或
DateAdd("h",[i1]+[i2]*10+[i3]*100+[i4]*1000,#4/10/2015 12:00:00 PM#)
【讨论】:
以上是关于Microsoft Access 查询返回序列号的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft Access 2016 查询为链接表中的空日期返回 1/1/1800
是否有一个查询会返回 Microsoft Access 表中的所有列名?