在SQL Server 2005的表中查找缺少的编号
我将int数据类型列设置为No,并希望找到表中缺少的No编号 例如:1,2,3,7,8,9 Ans=4,5,6 提前感谢。试试下面的内容-在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
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_值。架构名称应该在点之间。