【问题标题】:SQL to Access database which allows me to select 'n' consecutive numbersSQL to Access 允许我选择“n”个连续数字的数据库
【发布时间】:2019-10-13 20:37:32
【问题描述】:

这可能是一个很大的帮助,但需要一些帮助来尝试使用 VB.NET 从访问数据库中获取某些数据集。我找到了一篇很棒的文章,问题基本上是我想要的,但是不幸的是,给出的解决方案不适用于访问。

请看这里的主题: https://dba.stackexchange.com/questions/36943/find-n-consecutive-free-numbers-from-table

对我有用且完美的代码在这里: http://sqlfiddle.com/#!1/a2633/2

理想情况下,我应该有一个适当的 SQL 数据库,但不幸的是我被 MS Access 卡住了,而且我知道它不接受 ROW_NUMBERPARTITION BY ...我怎么知道?我已经尝试并用谷歌搜索了:~)

基本上我在数据库中有一个数字列表,如下所示:

我当前的 SQL 是

SELECT TOP 5 
    [ID], [UIDNo] 
FROM 
    [tblUIDS] 
WHERE 
    [Requester] IS NULL 
ORDER BY 
    ID

5 是一个变量,用户说我想要 x 数量,因此 SQL 语句返回 UIDNos 的最高数量,这是大的,然后它向请求者执行 INSERT 语句。但是 id 喜欢它能够返回 5 个连续的 UIDNo。

因此基于上图,如果用户想要 2 个 UIDNo,它将返回 00004 和 00005,而不是只返回 00001 和 00004。如果用户想要 6 个 UIDNo,它将返回 00032-00037 等等。

使用 VB.NET 甚至允许我像这样查询 MS Access 数据库吗?如果以另一种方式更容易,我也愿意接受建议......

提前致谢

【问题讨论】:

  • 序列号不够怎么办? TOP 1000000?应该返回什么?
  • 变量有 3000 的限制,但如果没有可用的变量,则什么也不返回。用户可以随时降低他们的请求,直到他们找到一些
  • 我很困惑。您是说要返回不在表格中的UIDnos 吗?这似乎很奇怪。
  • @SpyingSphinx 。 . .我得到它。我建议使用除 MS Access 之外的任何数据库。
  • 这是一个例子,其中简单地循环一次记录将比难以理解的 SQL 更快、更简单。 对于每条记录如果下一个UIDNo是连续的,则加一并存储ID;如果不是,则将计数器重置为 1 和存储的 ID 并继续。当计数达到所需数量时,退出循环,您将获得序列的存储 ID。对于存储,请使用适合您的目的:DataTable、List、Array、Dictionary 等。

标签: sql vb.net ms-access


【解决方案1】:

不需要临时表。是的,代码很复杂,但你可以照着做。

非常感谢您引用的参考资料。

目前设置为获取 5 条记录

SELECT TOP 5 [id],
             [uidno]
FROM   consec
WHERE  uidno >= (SELECT First(first_number) AS StartAt
                 FROM   (SELECT Min(uidno) AS first_number,
                                Count(*)   AS ct_free
                         FROM   (SELECT id,
                                        uidno,
                                        Dcount("uidno", "consec",
                                        "uidno <=" & [uidno])
                                        AS
                                        Counter,
                                        uidno - counter
                                        AS Grp
                                 FROM   (SELECT TOP 90000 [id],
                                                          [uidno]
                                         FROM   consec
                                         WHERE  [requester] IS NULL
                                         ORDER  BY uidno,
                                                   id) AS in1) x
                         GROUP  BY grp
                         HAVING Count(*) >= 5
                         ORDER  BY grp)) 

交付

id      uidno
615092  32
615093  33
615094  34
615095  35
615096  36

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多