SQL返回特定范围内未使用的整数值

SQL返回特定范围内未使用的整数值,sql,select,Sql,Select,是否可以使用SQL返回不在特定数据集中但在值范围内的值列表 例如,我有一个包含以下内容的专栏 Registration_no 1 5 6 9 我想返回范围内最小值和最大值之间的所有“未使用”整数,在本例中为2、3、4、7和8 这可以通过SQL语句实现吗 非常感谢,使用通用SQL无法将它们作为值列表获取。但是,你可以把它们作为靶场 select registration_no + 1 as StartMissingRange, registration_no - 1 as EndMissingR

是否可以使用SQL返回不在特定数据集中但在值范围内的值列表

例如,我有一个包含以下内容的专栏

Registration_no
1
5
6
9
我想返回范围内最小值和最大值之间的所有“未使用”整数,在本例中为2、3、4、7和8

这可以通过SQL语句实现吗


非常感谢,

使用通用SQL无法将它们作为值列表获取。但是,你可以把它们作为靶场

select registration_no + 1 as StartMissingRange, registration_no - 1 as EndMissingRange
from (select r.*,
             (select min(registration_no)
              from registrations r2
              where r2.registration_no > r.registration_no
             ) as next_ro
      from registrations r
     ) t
where next_ro <> registration_no + 1;
这是通用SQL。根据数据库的不同,还有其他解决方案,例如使用lead函数。如果希望列表的每一行上都有单独的数字,那么递归CTE是许多数据库支持的一种方法

CREATE TABLE [table]
(number varchar(250))

INSERT INTO [table] VALUES (1),(5),(6),(9)

SELECT * FROM [table]

DEClARE @a varchar(250)
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
这将为您提供缺失的数字…2,3,4,7,8测试数据

质疑

只需这样做:

DECLARE @MinVal int 
DECLARE @MaxVal int
SELECT @MinVal=Min(registration_no),@MaxVal=Max(registration_no) FROM TableName
;WITH nums AS
   (SELECT @MinVal AS value
    UNION ALL
    SELECT value + 1 AS value
    FROM nums
    WHERE nums.value <@MaxVal)
SELECT *
FROM nums  
WHERE value NOT IN (SELECT registration_no FROM TableName)

请参见中的结果。

我相信,您可以使用常规SQL中的数字表来实现这一点。其思想是,您有一个表,其中的列只列出所有整数。然后加入该表以查找缺少的数字。基本上是一个穷人的序列

CREATE TABLE `Numbers` (
  `NUM` int(11) NOT NULL,
  PRIMARY KEY (`NUM`)
) ;
用整数填充表格

SELECT NUM
FROM
    (SELECT MIN(Registration_no) AS MIN_Range, Max(Registration_no) AS Max_Range
        FROM StackOverflow.Registration) r_temp
INNER JOIN 
    StackOverflow.Numbers n
ON 
    n.NUM >= r_temp.MIN_Range AND n.NUM <= r_temp.MAX_Range
LEFT OUTER JOIN 
    StackOverflow.Registration r
ON 
    r.Registration_no = n.NUM
WHERE r.Registration_no IS NULL
;

*

只需更新下面的范围注意:代码将仅适用于sys.columns表的大小

            /* TABLE OF VALUES */
            CREATE TABLE [#table](number varchar(250))
            INSERT INTO [#table] 
            SELECT 1 UNION
            SELECT 5 UNION
            SELECT 6 UNION
            SELECT 9 

            select * from
            (
                select row=row_number() OVER (ORDER BY name) from sys.columns
            )a
            where row BETWEEN 1 and 20 /*CHANGE THIS RANGE*/
            and row not in
            (
                SELECT number FROM [#table] /* TABLE OF VALUES */
            )

            DROP TABLE [#table]

在$lownumber和$HIGHNUMBER之间的$table中选择*您使用的数据库是什么?它是Oracle数据库。谢谢。这是一个很有帮助的解决方案。@Konzy262:如果您满意,请随意接受答案,这样它将帮助其他人在将来找到解决方案。
VALUE
2
3
4
7
8
CREATE TABLE `Numbers` (
  `NUM` int(11) NOT NULL,
  PRIMARY KEY (`NUM`)
) ;
SELECT NUM
FROM
    (SELECT MIN(Registration_no) AS MIN_Range, Max(Registration_no) AS Max_Range
        FROM StackOverflow.Registration) r_temp
INNER JOIN 
    StackOverflow.Numbers n
ON 
    n.NUM >= r_temp.MIN_Range AND n.NUM <= r_temp.MAX_Range
LEFT OUTER JOIN 
    StackOverflow.Registration r
ON 
    r.Registration_no = n.NUM
WHERE r.Registration_no IS NULL
;
            /* TABLE OF VALUES */
            CREATE TABLE [#table](number varchar(250))
            INSERT INTO [#table] 
            SELECT 1 UNION
            SELECT 5 UNION
            SELECT 6 UNION
            SELECT 9 

            select * from
            (
                select row=row_number() OVER (ORDER BY name) from sys.columns
            )a
            where row BETWEEN 1 and 20 /*CHANGE THIS RANGE*/
            and row not in
            (
                SELECT number FROM [#table] /* TABLE OF VALUES */
            )

            DROP TABLE [#table]