2012-09-19 16 views
-3

我有一個表的'位置'字段的範圍從1到25.我使用以下SQL來返回當前未使用的最低'位置';使用SQL從範圍中選擇最低的未使用數字

select top 1 field from [dbo].[misc_fields] where field NOT IN (select location from ListFields where listid = @listid) order by field 

與此問題是,它是在其上包含用於每個位置(1-25)的行的misc_fields表的依賴。我想刪除這個查找表的必要性,並在存儲過程本身中定義範圍。

+2

請輸入樣本數據,預期結果以及您當前擁有的內容。很難說出你在說什麼。我們不介意讀者。 – JonH

回答

-1

由馬丁·史密斯提供的鏈接服用;

WITH Locations (Location) AS 
     ( 
     SELECT 1 UNION ALL 
     SELECT 1 + Location FROM Locations WHERE Location < 26 
     ) 

SELECT Location INTO #Locations FROM Locations 

SELECT TOP 1 Location from #Locations where Location NOT IN (select location from ListFields where listid = @listid) order by Location 

DROP TABLE #Locations 
+0

得到愛人們在接受(因此推測是工作)回答3年以上的回答,沒有評論至於爲什麼。 – ChrisBint

2

這是我現在能想到的最好的,比你想象的要複雜一點;

SELECT MIN(pos) AS nextlocation FROM 
(
    SELECT location, ROW_NUMBER() OVER (ORDER BY location) AS pos 
    FROM ListFields WHERE listid=1 
    UNION 
    SELECT 0, MAX(location)+1 
    FROM ListFields WHERE listid=1 
) a 
WHERE location<>pos; 

請注意,這並不侷限於25,它可能會發出26,所以你需要自己檢測你的限制在其他地方。

SQLfiddle here to try it out

0

此解決方案不起作用。嗶嘰。

嘗試使用IDENTITY function

SELECT MIN(artificial_table.id) FROM your_table RIGHT JOIN 
(SELECT TOP 25 IDENTITY(int,1,1) AS id) AS artificial_table 
ON your_table.id = artificial_table.id WHERE your_table.id IS NULL 
+0

'IDENTITY'函數僅用於'SELECT ... INTO'不創建獨立的adhoc數字表。 –

+0

@Martin是的,我讀了我指出的主題。不幸的是,我沒有嘗試MSSQL,但我會試一試。 – Serge

+0

@Martin,是的,它不起作用(我在下面的答案中找到了SQLFiddle的鏈接) – Serge