SQL数据透视表:选择下一个可用数字

时间:2010-12-02 20:29:05

标签: sql sql-server-2005

我需要在集合中找到下一个可用的号码:

select min([pivot])
from   [pivot]
where not exists (
      select null as nothing
      from   product
      where  product.id = [pivot].[pivot])

但是,此应用程序将使用很长时间,[pivot]字段是一个整数。我真的不想创建2,147,483,647 [pivot]记录(从0到表中的大数字的连续数字)。创建视图需要很长时间。

T-SQL(Microsoft SQL Server 2005/2008)中是否有一些功能可以提供[pivot]表而不实际创建一个。创建[pivot]视图很糟糕,因为访问视图需要花费大量时间。

3 个答案:

答案 0 :(得分:3)

看看这样的东西是否适合你。在我的例子中,#Test有一个5洞应该返回,第二个(#Test2)没有洞,所以我们期望返回一个新的ID。它是通过自我加入完成的。我不确定你为什么会有一个支点,所以我可能会误解你的问题。

CREATE TABLE #test
(
    num int
)

CREATE TABLE #test2
(
    num int
)

INSERT INTO #test (num)
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 6 UNION ALL
SELECT 7 

INSERT INTO #test2 (num)
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL 
SELECT 7

SELECT MIN(t1.num)+1 FROM #test t1
    LEFT JOIN #test t2 ON t1.num+1 = t2.num
    WHERE t2.num IS NULL

SELECT MIN(t1.num)+1 FROM #test2 t1
    LEFT JOIN #test2 t2 ON t1.num+1 = t2.num
    WHERE t2.num IS NULL

答案 1 :(得分:1)

我不确定这是否是最佳方式,但它回答了有关自动创建表格的主要问题:

WITH myValueTable AS (
    SELECT 1 AS 'val'
    UNION ALL
    SELECT val + 1 FROM myValueTable WHERE val < 1000
)
SELECT * FROM myValueTable OPTION (MAXRECURSION 1000)

...将返回单个列表,其值为1到1000.但是,如果您要定期执行此操作,则创建静态表会更快(对于整体查询)。如果您可以将值固定到给定范围,例如,从124开始并生成下一个10,那么这将是一个改进。

但是如果不了解更多有关查询的信息,很难知道这是否是您手头工作的最佳解决方案。如果你能提供一些你已经得到的和你想要的东西的样本数据,那将会有所帮助。

编辑... 的 如果你想在一组数字中找到一个“缺口”,你可以尝试:

WITH mycte AS (
    SELECT product.id, ROW_NUMBER() OVER (ORDER BY product.id) AS 'rownum' FROM product
    UNION
    SELECT MAX(product.id), MAX(product.id) + 1 FROM product
)
SELECT MIN(rownum) FROM mycte WHERE rownum <> id

...再次无法保证性能,但可能会给你一些想法。

答案 2 :(得分:0)

select min([pivot]) + 1 as next_num