2013-05-29 17 views
1

我有一个ID的列表,如“FIRST_LAST”格式。SQL:如何生成一个唯一的ID给定表FirstName_LastName ###字段

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

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

如果我没有意义,请让我知道。

+1

是不是太晚了在你的设计过程中做出这些单独的数据字段? –

+0

是的,主表或多或少设置 – MrP

+0

设计你的表有没有first_name,last_name和代理自动生成的ID字段为时已晚?这永远不会有效,运行时问题的可能性很高,而且在设计正确时不需要做这样的事情。名称永远不会是唯一的,因此向它们添加数字以使它们独一无二,这使得查询它们变得更加困难。使用代理键。这确实是一个不可行的设计。 – HLGEM

回答

0

我同意唐乔治。这里的设计对于你正在尝试做的事情是有缺陷的。如果可以的话,返回并将FIRST分解到它自己的数据字段,然后将它作为自己的字段。每个新条目都应该有一个唯一的自动递增ID,这应该是该记录的关键。如果你想知道“约翰·史密斯”有多少,那么你可以简单地做一个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代码。

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