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 Server 2005的表中查找缺少的编号_Sql_Sql Server_Database_Tsql_Sql Server 2005 - Fatal编程技术网

在SQL Server 2005的表中查找缺少的编号

在SQL Server 2005的表中查找缺少的编号,sql,sql-server,database,tsql,sql-server-2005,Sql,Sql Server,Database,Tsql,Sql Server 2005,我将int数据类型列设置为No,并希望找到表中缺少的No编号 例如:1,2,3,7,8,9 Ans=4,5,6 提前感谢。试试下面的内容- DECLARE @TABLE TABLE (NUM INT) INSERT INTO @TABLE VALUES (1) ,(2) ,(3) ,(7) ,(8) ,(9) DECLARE @MIN INT DECLARE @MAX INT SELECT @MIN = MIN(NUM) + 1, @MAX = MAX(NUM) - 1 FROM @TA

我将int数据类型列设置为No,并希望找到表中缺少的No编号

例如:1,2,3,7,8,9

Ans=4,5,6

提前感谢。

试试下面的内容-

DECLARE @TABLE TABLE (NUM INT)

INSERT INTO @TABLE
VALUES
 (1)
,(2)
,(3)
,(7)
,(8)
,(9)

DECLARE @MIN INT
DECLARE @MAX INT

SELECT @MIN = MIN(NUM) + 1, @MAX = MAX(NUM) - 1 FROM @TABLE

CREATE TABLE #TMP (FIELD_NO INT)
WHILE @MIN <= @MAX
BEGIN
   IF NOT EXISTS (SELECT * FROM @TABLE WHERE NUM = @MIN)
      INSERT INTO #TMP (FIELD_NO) VALUES (@MIN)
   SET @MIN = @MIN + 1
END

SELECT * FROM #TMP

DROP TABLE #TMP
你可以使用

这里我使用范围为0-2047的master..spt_值。您可以将其替换为您自己的具有足够值的数字表

declare @T table
(
  Number int
);

insert into @T values (1),(2),(3),(7),(8),(9);

with MinMax as
(
  select min(Number) as MinNumber,
         max(Number) as MaxNumber
  from @T
),
Number as
(
  select N.Number
  from master..spt_values as N
    inner join MinMax as MM
      on N.number between MM.MinNumber and MM.MaxNumber
  where N.type = 'P' 
)
select Number
from Number as N
where not exists
  (
    select *
    from @T as T
    where T.Number = N.number
  )
order by N.number
仅在普通sql中:

SELECT a.id+1 AS start, MIN(b.id) - 1 AS end
FROM sequence AS a, sequence AS b
WHERE a.id < b.id
GROUP BY a.id
HAVING start < MIN(b.id)

您可以在

MIN应该作为MIN+1启动,MAX应该作为MAX-1启动,然后再进入循环,因为我们知道MIN和MAX已经存在,所以没有必要在循环中再次检查这两个值。感谢段落,这很有用,但在我们的例子中,从另一个select语句派生的MIN和MAX变量存在问题,所以请告诉我如何执行select语句loop@Seasoned-初始化MIN=MIN+1可以,但初始化MAX=MAX+1会得到一个不想要的结果。MIN应该是MIN+1,但对于MAX,我提到的它应该是MAX-1,即MAX-1,而不是+1。得到它。谢谢@老练的:我通常会发现。。在一些查询中,这意味着什么?@JohnWoo我可以编写master.dbo.spt_值。架构名称应该在点之间。