Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 列表中缺少编号或最大编号_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 列表中缺少编号或最大编号

Sql 列表中缺少编号或最大编号,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在寻找列表中缺少的数字,它工作得非常好,但当它从2开始时,是否可能得到1。在下面插入 它应该提供1而不是4。请帮忙,谢谢 drop table #temp create table #temp ( Number INT ) insert into #temp (Number) select 2 union all select 3 union all select 5 SELECT MIN(t1.Number) + 1 AS MissingNumber FROM #temp t1

我正在寻找列表中缺少的数字,它工作得非常好,但当它从2开始时,是否可能得到1。在下面插入 它应该提供1而不是4。请帮忙,谢谢

drop table #temp
create table #temp
(
Number INT
)

insert into #temp
(Number)
select 2 union all
select 3 union all
select 5


SELECT MIN(t1.Number) + 1 AS MissingNumber 
FROM #temp t1 
LEFT OUTER JOIN #temp t2 ON (t1.Number + 1 = t2.Number) 
WHERE t2.Number IS NULL

我建议您创建一个单独的数字表来实现这一点

有许多方法可以创建数字表。查看此以了解更多信息

SELECT TOP (1000) n = Row_number()OVER (ORDER BY number)
INTO   #numbers
FROM   [master]..spt_values
ORDER  BY n;

CREATE TABLE #temp
  (Number INT)

INSERT INTO #temp(Number)
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 5

SELECT Min(t1.n) AS MissingNumber
FROM   #numbers t1
       LEFT OUTER JOIN #temp t2
                    ON ( t1.n = t2.Number )
WHERE  t2.Number IS NULL 

我认为这是不可能的,因为join不知道数字从1开始。它将搜索最小值

我们可以使用while循环来解决问题

使用这个

IF OBJECT_ID('Tempdb..#temp') IS NOT NULL 
    DROP TABLE #temp
CREATE TABLE #temp ( Number INT )
INSERT  INTO #temp
        ( Number )
VALUES  ( 2 ),
        ( 3 ),
        ( 5 );
WITH    cte
          AS ( SELECT   n = 1
               UNION ALL
               SELECT   n + 1
               FROM     cte
               WHERE    n <= 100 --can be increased with OPTION  ( MAXRECURSION {iteration value} ) at the end of the query
             )
    SELECT  MIN(cte.n) AS MissingNumber
    FROM    cte
            LEFT JOIN #temp t ON ( cte.n = t.Number )
    WHERE   t.Number IS NULL

执行此操作的目的是什么?