我需要的
給定一組從1到限制的數字n,獲取未被另一條記錄占用的最小數字
細節
我的任務是將一些客戶資訊上傳到資料庫中;它需要支持遺留功能,所以我無法控制它的結構。
有一列“代碼”是 INT,UNIQUE 并且已經插入了一些資料,但它不是連續的,因此例如它可以有以下記錄 (1,2,3,5,7,125,200,500,127000)
我需要用一個尚不存在的數字插入每條新記錄,但我不想在資料中留下“漏洞”。
我不能簡單地選擇最大的一個并添加一個,因為最大的一個可能非常接近列的限制,而兩者之間有很多可用的數字。我需要插入數千條記錄。
因此,例如對于我上面示例中的記錄,此函式將回傳“4”,因為“1”、“2”和“3”已被使用。然后,如果我使用“4”插入一條記錄,它將回傳“6”,因為“5”已經存在(因此請注意,我不能使用最后插入的記錄并添加一條記錄,因為也可能使用下一條記錄)...等等
我試過的
我實際上使用以下登錄名完成了它(我撰寫了偽代碼來簡化,因為查詢包含許多使查詢非常長的列)
-- for each record
DECLARE i = 0
WHILE i < limit
IF (COUNT(*) FROM MyTable WHERE Code = i) = 0
INSERT INTO MyTable (Code, ...) VALUES (i, ...)
BREAK
SET i = i 1;
這有效,但使查詢非常長并且效率不高,好像我有 1000 次插入和從 1 到 500 的記錄會回圈 500000 次。有一個更好的方法嗎?
就像是 INSERT INTO MyTable (Code, ...) VALUES (SMALLEST_AVALIABLE(Code), ...)
非常感謝您的參與!
uj5u.com熱心網友回復:
如何通過查詢做到這一點:
with range as (
select min(code) as min, max(code) as max from MyTable
), nums as (
select min as x from range
union all
select x 1 from nums
where x < (select max from range)
)
insert into MyTable (code)
select x from nums
left join MyTable on code = x
where code is null
option (maxrecursion 0)
見現場演示。
注意:這不是那么有效,除了編碼器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377486.html
標籤:sql sql-server 查询语句
