用于查找缺失序列号的SQL查询

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(值) .

  • @SamSaffron 链接已死。这是来自 Wayback Machine 的缓存副本:https://web.archive.org/web/20120312165219/http://www.projectdmx.com/tsql/tblnumbers.aspx (3认同)