2012-09-19 4 views
-3

'location'필드의 범위는 1에서 25까지입니다. 현재 사용되지 않는 가장 낮은 'location'을 반환하기 위해 다음 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

관련 문제