43 sql-server-2005 gaps-and-islands
我有一个名为的专栏sequence.此列中的数据类似于1,2,3,4,5,7,9,10,15.
我需要从表中找到丢失的序列号.什么SQL查询将从我的表中找到丢失的序列号?我期待结果如
Missing numbers
---------------
6
8
11
12
13
14
Run Code Online (Sandbox Code Playgroud)
我只使用一张桌子.我尝试了下面的查询,但没有得到我想要的结果.
select de.sequence + 1 as sequence from dataentry as de
left outer join dataentry as de1 on de.sequence + 1 = de1.sequence
where de1.sequence is null order by sequence asc;
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 28
怎么样的:
select (select isnull(max(val)+1,1) from mydata where val < md.val) as [from],
md.val - 1 as [to]
from mydata md
where md.val != 1 and not exists (
select 1 from mydata md2 where md2.val = md.val - 1)
Run Code Online (Sandbox Code Playgroud)
总结结果:
from to
----------- -----------
6 6
8 8
11 14
Run Code Online (Sandbox Code Playgroud)
Mar*_*ram 19
我知道这是一篇非常古老的帖子,但我想添加这个我在这里找到的解决方案,以便我可以更容易地找到它:
WITH Missing (missnum, maxid)
AS
(
SELECT 1 AS missnum, (select max(id) from @TT)
UNION ALL
SELECT missnum + 1, maxid FROM Missing
WHERE missnum < maxid
)
SELECT missnum
FROM Missing
LEFT OUTER JOIN @TT tt on tt.id = Missing.missnum
WHERE tt.id is NULL
OPTION (MAXRECURSION 0);
Run Code Online (Sandbox Code Playgroud)
Jon*_*han 12
试试这个:
declare @min int
declare @max int
select @min = min(seq_field), @max = max(seq_field) from [Table]
create table #tmp (Field_No int)
while @min <= @max
begin
if not exists (select * from [Table] where seq_field = @min)
insert into #tmp (Field_No) values (@min)
set @min = @min + 1
end
select * from #tmp
drop table #tmp
Run Code Online (Sandbox Code Playgroud)
van*_*van 10
最好的解决方案是使用带序列的临时表的解决方案.假设你构建了这样一个表,带有NULL检查的LEFT JOIN应该完成这项工作:
SELECT #sequence.value
FROM #sequence
LEFT JOIN MyTable ON #sequence.value = MyTable.value
WHERE MyTable.value IS NULL
Run Code Online (Sandbox Code Playgroud)
但是如果你不得不经常重复这个操作(以及数据库中的1个序列),我会创建一个"静态数据"表,并有一个脚本将它填充到你需要的所有表的MAX(值) .