2012-04-19 43 views
1

我在我的SQL表“Tokendata”中有一列TokenId列表。Sql查询获取下一个令牌编号

The TokenId has values say 1,2,3,4,6,7,8,10,11 

这里上面的tokenIds被占用。当我查询这个表时,它应该给我下一个自由tokenId,在这种情况下它应该是。

如果TokenId具有价值说“1,2,3,4,5,6,7,8,10,11,13,20”,查询应该返回我。

任何人都可以帮我一个SQL查询呢?

回答

0

这是我的问题的答案。但这可能不是乐观的解决方案。欢迎优化的解决方案

DECLARE @TempTable TABLE 
(
    TableID int PRIMARY KEY IDENTITY, 
    TokenId int 
) 
Insert Into @TempTable 
    Select tt.TokenId from XLBDataPoint tt where tt.TokenId= 1 
DECLARE @RowCount INT 
SET @RowCount = (SELECT COUNT(*) FROM @TempTable) 

(SELECT 
Top 1 t.TokenId + @RowCount 
FROM TokenData t 
Where t.TokenId+ @RowCount NOT in 
(select t2.TokenId FROM TokenData t2) 
+0

也许它是不相关的,但我只是好奇:你的问题被标记为'mysql',但你的答案脚本是Transact-SQL。为什么?你真的想要哪种平台的解决方案? – 2012-04-25 11:16:36

4

注意:根据评论更新为1缺失的情况。

SELECT 
    t.TokenId + 1 
FROM (
    SELECT TokenId 
    FROM Tokendata 
    UNION ALL 
    SELECT 0 
) t 
    LEFT JOIN Tokendata t2 ON t.TokenId = t2.TokenId - 1 
WHERE t2.TokenId IS NULL 
ORDER BY t.TokenId 
LIMIT 1 
+0

对于此数据“2,3,4,5,6,7,8”,您的查询返回9。但它实际上应该返回1 – Rockstart 2012-04-25 06:08:05

+0

你从未提到'1'必须始终是开始。无论如何,我认为我的编辑应该照顾到这一点。 – 2012-04-25 09:32:34

+0

@Andiry:它仍然不起作用 – Rockstart 2012-04-25 10:36:15