【问题标题】:Microsoft Access query returning sequential numbersMicrosoft Access 查询返回序列号
【发布时间】: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,我只想找到简短、干净、高效的代码。

【问题讨论】:

    标签: sql ms-access


    【解决方案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】:

    我认为您可以使用这样的解决方案:

    1. 像这样创建一个表(命名为t):

      ID | i
      ---+---
      1  | 0
      2  | 1
      3  | 2
      4  | 3
      5  | 4
      6  | 5
      7  | 6
      8  | 7
      9  | 8
      10 | 9
      
    2. 现在使用这个表来满足你的所有需要​​,例如从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;
      
    3. 例如,您可以将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#)
      

    【讨论】:

      猜你喜欢
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多