SQL:选择尚不存在的最低值

时间:2010-10-06 11:32:21

标签: sql sql-server tsql

在TableA中,我有一个int列。

是否可以仅使用select语句选择不存在且大于0的列中的最小值?

例如,如果col的值为1,2,9,则select语句将返回3。 如果col有9,10,11,它将返回1.

我可以使用临时表或使用循环来实现这一点,但我想知道我是否可以只使用select语句来完成它?

感谢。

7 个答案:

答案 0 :(得分:2)

SELECT MIN(t1.ID+1) as 'MinID'
FROM table t1 LEFT JOIN table t2
On t1.ID+1=t2.ID
Where t2.OtherField IS NULL

答案 1 :(得分:2)

select
min(nt.id)
from numbertable nt
left outer join originaldata od
on nt.id=od.id
where od.id is null

有一个数字表,从1到最大值(或更高)

答案 2 :(得分:2)

select min(id) from (select 1 id from TableA where 1 not in (select id from TableA)  UNION select id + 1  id from TableA where id + 1 not in (select id from TableA) ) as min_ids;

答案 3 :(得分:1)

SELECT DISTINCT x + 1 "val"
EXCEPT SELECT DISTINCT x "val"
ORDER BY "val" ASC
LIMIT 1

这个怎么样?

答案 4 :(得分:0)

试试这个:(更新)

    declare @dummy varchar(10)  ;

set @dummy =(select top(1) id from  dbo.b) 

if(   @dummy= '1')
begin
select top(1)l.id + 1 as start
from dbo.b  as l
  left outer join dbo.b  as r on l.id + 1 = r.id
where r.id is null
end
else 
begin
select '1'
end

答案 5 :(得分:0)

尝试一下:

declare @TestTable table (
    col int
)

/* Test Case 1: 1,2,9 */
insert into @TestTable
    (col)
    select 1 union all select 2 union all select 9

SELECT MinValue = (SELECT ISNULL(MAX(t2.col),0)+1
                      FROM @TestTable t2 
                     WHERE t2.col < t1.col)
 FROM @TestTable t1
 WHERE t1.col - 1 NOT IN (SELECT col FROM @TestTable)
   AND t1.col - 1 > 0

delete from @TestTable

/* Test Case 2: 9,10,11 */
insert into @TestTable
    (col)
    select 9 union all select 10 union all select 11

SELECT MinValue = (SELECT ISNULL(MAX(t2.col),0)+1
                      FROM @TestTable t2 
                     WHERE t2.col < t1.col)
 FROM @TestTable t1
 WHERE t1.col - 1 NOT IN (SELECT col FROM @TestTable)
   AND t1.col - 1 > 0

答案 6 :(得分:0)

我从here重复了我的回答:

SELECT MIN(a.id) + 1 AS firstfree
FROM (SELECT id FROM table UNION SELECT 0) a
LEFT JOIN table b ON b.id = a.id + 1
WHERE b.id IS NULL

这可以处理我能想到的所有情况 - 包括根本没有现有记录。

我唯一不喜欢这个解决方案的是,其他条件必须包括两次,如:

SELECT MIN(a.id) + 1 AS firstfree
FROM (SELECT id FROM table WHERE column = 4711 UNION SELECT 0) a
LEFT JOIN table b ON b.column = 4711 AND b.id = a.id + 1
WHERE b.id IS NULL

还请注意有关锁定和并发的评论 - 填补空白的要求在大多数情况下是糟糕的设计并且可能导致问题。但是,我有充分的理由这样做:ID将由人类打印和输入,我们不希望在一段时间后拥有多位数的ID,而所有低位的ID都是免费的......