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
    

    现在使用这个表来满足你的所有需要​​,例如从09999 使用这个查询:

    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 表中的所有列名?

Microsoft Access 中的选择查询在另一个表中查找返回错误结果的记录

Microsoft Access 查询条件

如何在 microsoft access 查询中格式化日期

Microsoft Access Make-Table 性能与传递查询