我需要在集合中找到下一个可用的号码:
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]视图很糟糕,因为访问视图需要花费大量时间。
答案 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