【问题标题】:SELECT lowest unused figure from range using SQL使用 SQL 从范围中选择最低的未使用数字
【发布时间】:2012-09-19 19:23:54
【问题描述】:

我有一个表,其“位置”字段的范围从 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

问题在于它依赖于 misc_fields 表,该表包含每个位置 (1-25) 的一行。我想不再需要这个查找表,只需在存储过程本身中定义范围。

【问题讨论】:

  • 请输入样本数据、预期结果以及您目前拥有的数据。很难说出你在说什么。我们不是读心术的人。

标签: sql-server-2008 stored-procedures


【解决方案1】:

这是我现在能想到的最好的,虽然比你的要复杂一点;

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.

【讨论】:

    【解决方案2】:

    此解决方案不起作用。塞尔吉。

    尝试使用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
    

    【讨论】:

    • IDENTITY 函数只对SELECT ... INTO 有用,不能创建独立的临时数字表。
    • @Martin 是的,我阅读了我指出的主题。不幸的是,我没有可以尝试的 MSSQL,但我会尝试一下。
    • @Martin,是的,它不起作用(我在下面的答案中找到了指向 SQLFiddle 的链接)
    • 动态创建数字表的各种方法are discussed here
    【解决方案3】:

    取自 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
    

    【讨论】:

    • 一定要喜欢人们在提出已接受(因此可能有效)的答案后 3 年多的时间里将其标记下来,但不知道为什么。
    猜你喜欢
    • 2011-01-05
    • 2011-12-21
    • 2023-03-14
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多