在TableA中,我有一个int列。SQL:选择不存在的最低值
是否有可能只使用select语句来选择不存在且大于0的列中的最小值?
例如,如果山坳有值1,2,9 select语句将返回3. 如果山坳有9,10,11它将返回1.
我可以在此使用取得临时表或使用循环,但我想知道如果我可以使用只是一个选择语句?
谢谢。
在TableA中,我有一个int列。SQL:选择不存在的最低值
是否有可能只使用select语句来选择不存在且大于0的列中的最小值?
例如,如果山坳有值1,2,9 select语句将返回3. 如果山坳有9,10,11它将返回1.
我可以在此使用取得临时表或使用循环,但我想知道如果我可以使用只是一个选择语句?
谢谢。
select
min(nt.id)
from numbertable nt
left outer join originaldata od
on nt.id=od.id
where od.id is null
有从1到你的最大价值数表(或更高版本)
SELECT DISTINCT x + 1 "val"
EXCEPT SELECT DISTINCT x "val"
ORDER BY "val" ASC
LIMIT 1
这是怎么回事?
试试这个:(更新)
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
这将返回比现有值多一个的第一个空闲值。所以它不能解决我的2个例子不幸的是 – Bob 2010-10-06 12:01:08
我更新了答案.hope它会工作 – anishMarokey 2010-10-06 14:52:31
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
试试这个:
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
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;
我重复我的回答从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,通常是一个糟糕的想法。 – Amadan 2010-10-06 11:36:59