是否可以使用SQL返回不在特定數據集中但在值範圍內的值列表?用於返回未在特定範圍內使用的整數值的SQL
例如,我有以下....
Registration_no
1
5
6
9
列我想返回的最小值和該範圍內的最大值,之間所有的「未使用的」整數其在此實例將2,3,4,7和8
這是可能的通過SQL語句的方式?
非常感謝,
是否可以使用SQL返回不在特定數據集中但在值範圍內的值列表?用於返回未在特定範圍內使用的整數值的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 @[email protected]+1
END
這會給你丟失號碼.... 2,3,4,7,8
測試數據
DECLARE @TABLE TABLE(registration_no INT)
INSERT INTO @TABLE VALUES
(1),(5),(6),(9)
查詢
;WITH CTE AS
(
SELECT MIN(registration_no) MinVal
,MAX(registration_no) MaxVal
FROM @TABLE
)
,
RequiredVals
AS
(
SELECT DISTINCT [number]
FROM master..spt_values
WHERE number >= (SELECT MinVal FROM CTE)
AND number <= (SELECT MaxVal FROM CTE)
AND NOT EXISTS (SELECT 1
FROM @TABLE
WHERE registration_no = spt_values.number)
)
SELECT number AS MissingValues
FROM RequiredVals
結果集
╔═══════════════╗
║ MissingValues ║
╠═══════════════╣
║ 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)
結果:
VALUE
2
3
4
7
8
參見導致SQL Fiddle。
感謝憤怒的公牛。這是一個有用的解決方案。 – Konzy262
@ Konzy262:如果您滿意,請隨時接受答案,以便將來幫助他人找到解決方案。 –
你可以用常規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
;
* http://www.sqlperformance.com/2013/01/t-sql-queries/generate-a-set-1
剛剛更新了 「範圍」 下面(注:代碼只會工作到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]
SELECT * FROM $表,其中Registration_no BETWEEN $ lownumber和$ highnumber – BlackPearl
你使用了哪個數據庫? –
這是一個Oracle數據庫。 – Konzy262