SQL Server获取表列中不包含的所有整数,最大为N
我有一个sql server数据库表,其中包含一个规范化的subversion日志。但是,缺少一些修订。如何获取所有缺少的修订 我试过了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
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;