2014-03-29 47 views
2

是否可以使用SQL返回不在特定數據集中但在值範圍內的值列表?用於返回未在特定範圍內使用的整數值的SQL

例如,我有以下....

Registration_no 
1 
5 
6 
9 

列我想返回的最小值和該範圍內的最大值,之間所有的「未使用的」整數其在此實例將2,3,4,7和8

這是可能的通過SQL語句的方式?

非常感謝,

+0

SELECT * FROM $表,其中Registration_no BETWEEN $ lownumber和$ highnumber – BlackPearl

+0

你使用了哪個數據庫? –

+0

這是一個Oracle數據庫。 – Konzy262

回答

0

你不能讓他們爲使用通用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是許多數據庫支持的一種方法。

0
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

0

測試數據

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 ║ 
╚═══════════════╝ 
0

只要做到這一點:

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

+0

感謝憤怒的公牛。這是一個有用的解決方案。 – Konzy262

+0

@ Konzy262:如果您滿意,請隨時接受答案,以便將來幫助他人找到解決方案。 –

0

你可以用常規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

0

剛剛更新了 「範圍」 下面(注:代碼只會工作到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] 
相關問題