Sql 在列中查找缺少的数字

Sql 在列中查找缺少的数字,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我在T-SQL中有这个专栏: 1 2 3 7 10 使用SQl函数检测序列4,5,6和8,9中的缺失数字 我试过了 差不多 如果(a-b>1),则我们缺少一个数字 与联合,但我不明白。 感谢您的光临您可以尝试以下方法: DELCARE @a SET @a = SELECT MIN(number) FROM table WHILE (SELECT MAX(number) FROM table ) > @a BEGIN IF @a NOT IN ( SELECT number FR

我在T-SQL中有这个专栏:

 1
 2
 3
 7
 10
使用SQl函数检测序列4,5,6和8,9中的缺失数字 我试过了 差不多 如果(a-b>1),则我们缺少一个数字

与联合,但我不明白。 感谢您的光临

您可以尝试以下方法:

DELCARE @a
SET @a = SELECT MIN(number) FROM table
WHILE (SELECT MAX(number) FROM table ) > @a
BEGIN
IF @a NOT IN ( SELECT number FROM table )
PRINT @a
SET @a=@a+1
END
您可以尝试以下方法:

DELCARE @a
SET @a = SELECT MIN(number) FROM table
WHILE (SELECT MAX(number) FROM table ) > @a
BEGIN
IF @a NOT IN ( SELECT number FROM table )
PRINT @a
SET @a=@a+1
END

以下查询将确定每个序列的起始位置以及缺失的编号:

select t.col + 1 as MissingStart, (nextval - col - 1) as MissingSequenceLength
from (select t.col,
             (select min(t.col) from t t2 where t2.col > t.col) as nextval
      from t
     ) t
where nextval - col > 1

这是使用相关子查询来获取表中的下一个值。

以下查询将确定每个序列的起始位置和缺少的数字:

select t.col + 1 as MissingStart, (nextval - col - 1) as MissingSequenceLength
from (select t.col,
             (select min(t.col) from t t2 where t2.col > t.col) as nextval
      from t
     ) t
where nextval - col > 1

这是使用相关子查询来获取表中的下一个值。

我知道这是一个迟来的答案,但下面是一个使用递归表表达式来获取表中最小值和最大值之间缺少的值的查询:

WITH CTE AS
(
    --This is called once to get the minimum and maximum values
    SELECT nMin = MIN(t.ID), MAX(t.ID) as 'nMax' 
    FROM Test t
    UNION ALL
    --This is called multiple times until the condition is met
    SELECT nMin + 1, nMax 
    FROM CTE
    WHERE nMin < nMax
)

--Retrieves all the missing values in the table.
SELECT c.nMin
FROM CTE c
WHERE NOT EXISTS
(
    SELECT ID
    FROM Test
    WHERE c.nMin = ID
)

我知道这是一个迟来的答案,但下面是一个使用递归表表达式获取表中最小值和最大值之间缺少的值的查询:

WITH CTE AS
(
    --This is called once to get the minimum and maximum values
    SELECT nMin = MIN(t.ID), MAX(t.ID) as 'nMax' 
    FROM Test t
    UNION ALL
    --This is called multiple times until the condition is met
    SELECT nMin + 1, nMax 
    FROM CTE
    WHERE nMin < nMax
)

--Retrieves all the missing values in the table.
SELECT c.nMin
FROM CTE c
WHERE NOT EXISTS
(
    SELECT ID
    FROM Test
    WHERE c.nMin = ID
)

如果你发布函数会有帮助……如果你有这样一个函数,你的问题是什么?@GordonLinoff“have SQL a function…”可能意味着“have SQL a function…”虽然这只是一个有根据的猜测,但如果你发布函数会有帮助……如果你有这样一个函数,你的问题是什么?@GordonLinoff“havesqlaffunction…”可能意味着“havesqlaffunction…”。。。?“虽然这当然只是一个有根据的猜测#winces#虽然这可能有效,但SQL的设计最适合在“集合”中工作;基本上,没有迭代器/循环。循环的某些应用可能会带来更好的性能,但它几乎总是会被基于集合的方法打败。@Clockwork Muse OK set通常比cursor更快。请为所述问题提供一个基于集合的解决方案。#winces#虽然这可能有效,但SQL的设计最适合在“集合”中工作;基本上,没有迭代器/循环。循环的某些应用可能会带来更好的性能,但它几乎总是会被基于集合的方法打败。@Clockwork Muse OK set通常比cursor更快。请为所述问题提供基于集合的解决方案。