2011-05-11 124 views
1

假設我的表格可以具有從000到999的值(三位小於1000)從MS SQL中獲取一個範圍內的隨機值?

其中一些值已填充。讓我們假設,目前我的表已經

000002005190(001004003006 .. 189191,...,999可以被插入到表)

這些值是隨機分配的000和002是在表中,但001不在表中呢。

如何獲取我可以插入表格的值呢?

+0

是否有任何大於1000的3位數字? – phoog 2011-05-11 07:17:22

+0

不可達999個數字。 – 2011-05-11 07:18:41

+0

如果數字不能重複,則不需要在表格上添加大小限制。 – phoog 2011-05-11 07:25:42

回答

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 

EDIT

該查詢的工作原理是從被保證包含CTE rnCTE內超過1000行的系統表(master.dbo.spt_values)產生可能數目的完整列表。 -1加入到ROW_NUMBER到具有值從0開始而不是1

外部查詢零個墊的數字進行顯示,只返回那些沒有在源數據和是小於1000

+0

我通過編寫下面的查詢來解決這個問題。 declare @count int; 選擇@計數= 000 CREATE TABLE #Temporary_tbl ( stylecode十進制 - VARCHAR(20) ) WHILE @count <999 開始 組@計數= @計數+ 1 SELECT * FROM樣式其中鑄造(stylecode爲INT)= @count 如果(@@行數= 0) 開始 插入到#Temporary_tbl(stylecode)選擇@count 端 端從#Temporary_tbl 降表#Temporary_tbl 選擇頂(1)**請你優化這個查詢!**讓我知道你的工作查詢 – 2011-05-11 08:06:28

+0

@Zain - 編輯答案來解釋它是如何工作的。沒有太多的空間可以優化你的解決方案,因爲它使用了「WHILE」循環 - 我建議的解決方案是基於集合的,並且應該更高效。 – 2011-05-11 08:21:57

0

您將不得不編寫一個T-SQL來首先查詢並找到差距。沒有現成的SQL可以直接給你提供差距。

+0

好的,你能指導我如何寫查詢來找到差距? – 2011-05-11 07:19:24

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() 
相關問題