假設我的表格可以具有從000到999的值(三位小於1000)從MS SQL中獲取一個範圍內的隨機值?
其中一些值已填充。讓我們假設,目前我的表已經
000002005190(001004003006 .. 189191,...,999可以被插入到表)
這些值是隨機分配的000和002是在表中,但001不在表中呢。
如何獲取我可以插入表格的值呢?
假設我的表格可以具有從000到999的值(三位小於1000)從MS SQL中獲取一個範圍內的隨機值?
其中一些值已填充。讓我們假設,目前我的表已經
000002005190(001004003006 .. 189191,...,999可以被插入到表)
這些值是隨機分配的000和002是在表中,但001不在表中呢。
如何獲取我可以插入表格的值呢?
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
我通過編寫下面的查詢來解決這個問題。 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
@Zain - 編輯答案來解釋它是如何工作的。沒有太多的空間可以優化你的解決方案,因爲它使用了「WHILE」循環 - 我建議的解決方案是基於集合的,並且應該更高效。 – 2011-05-11 08:21:57
您將不得不編寫一個T-SQL來首先查詢並找到差距。沒有現成的SQL可以直接給你提供差距。
好的,你能指導我如何寫查詢來找到差距? – 2011-05-11 07:19:24
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()
是否有任何大於1000的3位數字? – phoog 2011-05-11 07:17:22
不可達999個數字。 – 2011-05-11 07:18:41
如果數字不能重複,則不需要在表格上添加大小限制。 – phoog 2011-05-11 07:25:42