Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server获取表列中不包含的所有整数,最大为N_Sql_Sql Server_Tsql - Fatal编程技术网

SQL Server获取表列中不包含的所有整数,最大为N

SQL Server获取表列中不包含的所有整数,最大为N,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个sql server数据库表,其中包含一个规范化的subversion日志。但是,缺少一些修订。如何获取所有缺少的修订 我试过了 SELECT Revision + 1 FROM SvnLog WHERE Revision + 1 NOT IN (SELECT Revision FROM SvnLog) 但是,在缺少范围的情况下,在第一次缺少修订之后,这就遗漏了任何内容。例如,如果缺少100-110,它只拾取100 我也试过了 WITH revs(rev) AS ( SEL

我有一个sql server数据库表,其中包含一个规范化的subversion日志。但是,缺少一些修订。如何获取所有缺少的修订

我试过了

SELECT Revision + 1
  FROM SvnLog
  WHERE Revision + 1 NOT IN (SELECT Revision FROM SvnLog)
但是,在缺少范围的情况下,在第一次缺少修订之后,这就遗漏了任何内容。例如,如果缺少100-110,它只拾取100

我也试过了

WITH revs(rev) AS (
  SELECT 0
  UNION ALL
  SELECT revs.rev + 1
  FROM revs
  WHERE revs.rev <90000
)

SELECT rev
FROM revs
WHERE rev NOT IN (SELECT Revision from SVNLog)
但是CTE中的递归在100处被切断,我有数千个修订。

有一个选项可以控制CTE的递归。可以使用MAXRECURSION 0删除限制

WITH revs(rev) AS (
  SELECT 0
  UNION ALL
  SELECT revs.rev + 1
  FROM revs
  WHERE revs.rev <90000
)

SELECT rev
FROM revs
WHERE rev NOT IN (SELECT Revision from SVNLog)
OPTION (MAXRECURSION 0);

我发现这个问题更容易用数字中的间隔长度来解决,而不是单独列出每一个。毕竟,对数万行或数十万行执行递归的性能可能不如您所希望的

您不指定正在使用哪个版本的SQL Server。在SQL Server 2012中,使用lag最容易做到这一点。但这里有一个更通用的版本:

select (revision + 1) as gapStart, (nextrevision) - 1 as gapEnd
from (select l.revision,
             (select min(l2.revision)
              from SVNLog l2
              where l2.revision > l.revision
             ) as NextRevision
      from SVNLog l
     ) l
where nextrevision <> revision + 1;

如果没有间隙,则返回0。否则,就会有差距。

我知道肯定会有差距。如果我运行第一个查询,我会得到一个错误,说明无法选择修订,因为它不包含在聚合函数或GROUPBY子句中。另一个答案符合我的需要,但谢谢你的帮助!
select (max(revision) - min(revision) + 1) - count(distinct revision)
from SVNLog l;