1

我有一个类似“FIRST_LAST”格式的 ID 列表。

我有一个“主”表,里面有一堆 FIRST_LAST## 条目,其中 ## 是一些数字。我正在尝试查找最后一个未使用的名称和正在使用的号码。

示例用法:我有 John_Smith,但我不知道主表中有多少 John Smith。主表中有 John_Smith1、John_Smith2 等,但我想知道第一个可用的。所以我有 John_Smith,我希望能够对表进行扫描,并看到 John_Smith8 是主表中第一个未使用的名称。

如果我没有道理,请告诉我。

4

2 回答 2

1

以下 VBA 函数可能会有所帮助:

Public Function GetNextFirstLastID(first_last As String) As String
Dim cdb As DAO.Database, rst As DAO.Recordset, nextN As Long
Set cdb = CurrentDb
Set rst = cdb.OpenRecordset( _
        "SELECT Max(CLng(Mid(first_lastID, " & Len(first_last) + 1 & "))) " & _
        "FROM mainTable " & _
        "WHERE first_lastID LIKE """ & first_last & "#*""", _
        dbOpenSnapshot)
If IsNull(rst(0).Value) Then
    nextN = 1
Else
    nextN = rst(0).Value + 1
End If
rst.Close
Set rst = Nothing
Set cdb = Nothing
GetNextFirstLastID = first_last & nextN
End Function

对于这样的测试数据...

first_lastID   
---------------
gord_thompson1 
gord_thompson11
gord_thompson2 
gord_thom1     

...函数返回

?GetNextFirstLastID("gord_thompson")
gord_thompson12
?GetNextFirstLastID("gord_thom")
gord_thom2
?GetNextFirstLastID("john_smith")
john_smith1
于 2013-05-29T21:02:32.350 回答
0

我同意唐·乔治的观点。这里的设计对于你想要做的事情是有缺陷的。如果可以,请返回并将 FIRST 分解为它自己的数据字段,然后将 LAST 分解为它自己的字段。每个新条目都应该有一个唯一的自动递增 ID,这应该是该记录的关键。如果你想知道有多少个“John Smiths”,那么你可以简单地做一个COUNT()


如果你不能这样做,那么一个性能很差的尝试是创建一个带有递增计数器的 SQL 循环:

DECLARE @counter int
SET @counter = 1

DECLARE @name nchar(100)
SET @name = 'john_smith' + CAST(@counter AS nchar(4))

WHILE (Exists(Select * From MainTable WHERE ID = @name ))
BEGIN
   SET @counter = @counter + 1
   SET @name = 'john_smith' + CAST(@counter AS nchar(4))
END

-- Now you have your @name to use...

从设计的角度来看,如果这是您唯一的选择,我会创建一个名为GetUniqueID(FIRST, LAST)返回唯一 ID 的函数。它将执行上面的这个功能。

然后,您可以稍后存入任何性能更好的 SQL 代码。

于 2013-05-29T20:19:11.993 回答