1

我找到了获取下一个 4 位数字的好方法。 如何找到下一个免费的唯一 4 位数号码

但就我而言,我想获得下一个可用的 4 位或 5 位数字。这将根据用户的要求而改变。这些编号不是关键的 ID 列,但它们对于业务目的的标记结构是必不可少的。

目前我使用表适配器查询。但是我将如何编写查询。我想我可以对所有值进行长时间的迭代循环,直到看到 4 位数字。

但我正在尝试想一些更有效的方法。

Function GetNextAvailableNumber(NumofDigits) as Long
'SQL Code Here ----
'Query Number Table

Return Long


End Function

这是我当前的 SQL:

'This Queries my View
SELECT MIN([Number]) AS Expr1
FROM  LineNumbersNotUsed

'This is my View SQL 
SELECT Numbers.Number
FROM Numbers
WHERE (((Exists (Select * From LineList Where LineList.LineNum =  Numbers.Number))=False))
ORDER BY Numbers.Number;

Numbers 是从 0 到 99999 的所有可用数字的列表,基本上可以使用。

LineList 是我的最终主表,我在其中保存了长信息和所有相关的其他业务信息。

希望这是有道理的。

天哪,你们对新人太苛刻了。我不小心按了回车键,问题发布了,我立即得到 -3 票。

让新人休息一下好吗!请。

4

2 回答 2

1

如果我忽略了您问题中的某些内容,我提前道歉。使用您的设计,这样的查询不会返回下一个未使用的 4 位数字吗?

SELECT MIN([Number]) AS next_number
FROM  LineNumbersNotUsed
WHERE
        [Number] > 999
    AND [Number] < 10000;

这种方法不适用于多个并发用户,但您没有指出这对您来说是个问题。

于 2012-05-04T19:15:12.683 回答
1

您链接到的问题说明您需要的是一个包含 2 个字段的表:

Number     InUse
0000       No
0001       No
0002       Yes
0003       No
0005       Yes

每当使用/释放数字时,必须更新表格以设置InUse为是/否。

也许我遗漏了一些东西,但是从您的解释以及您向我们展示的 SQL 代码来看,您似乎只有一个包含从 0 到 100000 的所有数字的单个字段的表。
如果是这种情况,我看不到那张桌子的用处。

如果我是你,如果我正确理解你的需求,你想要的是这样的:

  1. 首先,创建如上表,包含从 0 到 100000 的所有运行数字,以及用于确认是否使用该数字的字段。

  2. 使用表中已包含的所有数字初始化该InUse字段LineList,例如:

    UPDATE Numbers SET InUse = True
    WHERE  Numbers.Number IN (SELECT LineNum FROM LineList)
    
  3. 按照以下逻辑顺序编写一个函数ReserveNumber(NumOfDigits as Integer) As Long来查找和保留一个 4 位或 5 位空闲号码:

    • 根据NumOfDigits(4 或 5)获得查询之一的结果为 LowestNumber

      SELECT Min(Number) FROM Numbers WHERE Number < 10000 AND NOT InUse
      SELECT Min(Number) FROM Numbers WHERE Number >= 10000 AND NOT InUse
      
    • 保留该特定号码以确保不会再次使用它:

      UPDATE Numbers SET InUse = True WHERE Number = @LowestNumber
      
    • 返回 LowestNumber

  4. 每当

注意:上面的逻辑有点幼稚,因为它假设没有两个用户会同时尝试获得最小的数字。但是,有可能有一天会发生这种情况。
例如,要消除这种风险,您可以TakenBy在表中添加一列Numbers并将其设置为当前用户名。然后,在您保留号码后,再次读取以确保TakenBy当前客户端确实更新了号码。如果没有,请尝试增益。
有很多方法可以做到这一点。您也可以尝试摆弄桌子锁,但无论您的解决方案如何,请确保您对其进行测试。

于 2012-05-07T05:23:10.653 回答