从MS SQL中的范围中获取随机值?

时间:2011-05-11 07:11:59

标签: sql-server-2008 tsql

假设我的表的值可以是000到999(三位数小于1000)

其中一些值已填满。我们假设目前我的桌子有

000,002,005,190(001,004,003,006,... 189,191,...,999可插入表格)

并且这些值是随机分配的000和002在表中但是001还没有在表中。

如何获取我可以插入表中的值。

3 个答案:

答案 0 :(得分:2)

DECLARE @t TABLE(id INT)
INSERT INTO @t (id) 
VALUES 
(1),(19),(3)

;WITH numbers AS (
SELECT ROW_NUMBER() OVER(ORDER BY o.object_id,o2.object_id) RN FROM sys.objects o
CROSS JOIN sys.objects o2
),  NotExisted AS(
SELECT * FROM numbers WHERE RN NOT IN (SELECT ID FROM @t)
AND RN<1000)
SELECT TOP 1 RN FROM NotExisted ORDER BY NEWID()

答案 1 :(得分:2)

DECLARE @t TABLE
(VALUE CHAR(3))

INSERT @t
VALUES
('000'),('002'),('005'),('190')


;WITH rnCTE
AS
(
    SELECT -1 + ROW_NUMBER() OVER (ORDER BY TYPE, number, name) AS rn
    FROM master.dbo.spt_values
)
SELECT RIGHT('000' + CAST( rn AS VARCHAR(11)),3)
FROM rnCTE
WHERE NOT EXISTS    (   SELECT 1 FROM @t 
                        WHERE VALUE = rn
                    )
AND rn < 1000

修改

此查询的工作原理是从系统表(master.dbo.spt_values)生成可能数字的完整列表,该表保证在CTE rnCTE内包含超过1000行。 -1被添加到ROW_NUMBER以使值从0开始而不是1。

外部查询零填充显示的数字,仅返回那些不在源数据中且小于1000的数字。

答案 2 :(得分:0)

您必须在第一次查询时编写T-SQL并找到差距。没有现成的SQL会直接给你带来差距。