2014-02-18 44 views
-1

我讀過幾篇文章,說一個普通程序員犯的一個錯誤是沒有使用SQL的潛力,從那時起我開始用SQLish解決方案替換部分代碼,而不是提取數據和處理用編程語言,雖然我是一個真正的SQL新手。在範圍中查找缺少的數值

說我有一個隨機填充值從0到10的表,我想知道哪些值在此範圍內丟失。例如,表格由以下值組成:0, 1, 3, 4, 5, 7, 8, 9

查詢應該會返回:2, 6, 10

+1

IDK什麼級別的編程你,但如果你願意的接受一些建議我可以保證你會遇到這樣的問題:「我開始尋找用SQLish解決方案替換部分代碼」。 –

+1

它是哪個數據庫系統? – Szymon

回答

0

[F5]溶液(假設SQL服務器):

-- table with id=0..10 
drop table #temp 
GO 
create table #temp (
    id int not null identity(0,1), 
    x int 
) 
GO 
insert into #temp (x) values(0) 
GO 11 


-- your number: 
drop table #numbers 
GO 
select 
    * 
into #numbers 
from (
    select 0 as n union all select 1 union all select 3 union all select 4 union all select 5 union all select 7 union all select 8 union all select 9 
) x 
GO 

-- result: 
select 
    * 
from #temp t 
left join #numbers n 
    on t.id=n.n 
where 1=1 
    and n.n is null 
+0

爲什麼'where 1 = 1'? – DrCopyPaste

+0

@DrCopyPaste只是我的習慣:)。 –

+0

這就是我的想法,但它起源於哪裏?是否有一些非常罕見的情況會給你帶來巨大的好處?只是好奇,也許值得采用這種習慣:D – DrCopyPaste

0

此解決方案使用SQL-Server的語法(但據我所知只有GO是特定於SQL Server Management Studio中)

我會參加對錶值函數,它讓你在一定範圍內的所有數字(example fiddle):

CREATE FUNCTION dbo.GetNumbersInRange(@Min INT, @Max INT) 
     RETURNS @trackingItems TABLE (Number INT) 
     AS BEGIN 

     DECLARE @counter INT = @Min 

     WHILE (@counter <= @Max) 
     BEGIN 
      INSERT INTO @trackingItems (Number) SELECT @counter 

      SELECT @counter = @counter + 1 

     END 

     RETURN 

     END 
     GO 

作爲一個例子,我已經建立了一個表包含一些數字(帶缺口)

CREATE TABLE MyNumbers (Number INT) 

INSERT INTO MyNumbers (Number) 
    SELECT 1 
    UNION 
    SELECT 2 
    UNION 
    SELECT 4 
    UNION 
    SELECT 5 
    UNION 
    SELECT 7 
    UNION 
    SELECT 8 

尋找失蹤的數字,您可以使用LEFT JOIN這樣

SELECT 
     AllNumbers.Number 
     FROM GetNumbersInRange(1, 10) AS AllNumbers 
     LEFT JOIN MyNumbers ON AllNumbers.Number = MyNumbers.Number 
     WHERE MyNumbers.Number IS NULL