-3

1 ~ 25 の範囲の「場所」フィールドを持つテーブルがあります。次の 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 テーブルに依存していることです。このルックアップ テーブルを用意する必要をなくし、ストアド プロシージャ自体で範囲を定義するだけにしたいと考えています。

4

3 に答える 3

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 を試してみてください

于 2012-09-19T19:51:51.533 に答える
0

この解決策は機能しません。サージ。

IDENTITY 関数を使用してみてください:

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
于 2012-09-19T20:00:28.213 に答える
-1

Martin Smith 提供のリンクから引用。

 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
于 2012-09-19T21:05:27.967 に答える