SQL返回特定范围内未使用的整数值
是否可以使用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
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]