在范围内找到缺失的数值

时间:2014-02-18 11:00:09

标签: sql

我已经阅读了几篇文章,认为普通程序员所犯的错误之一就是没有使用SQL的潜力,从那以后我开始用SQLish解决方案替换部分代码而不是使用编程语言获取数据和处理,尽管我是一个真正的SQL新手。

假设我有一个随机填充0到10之间值的表格,我想知道此范围内缺少哪些值。

例如,该表包含以下值:0, 1, 3, 4, 5, 7, 8, 9

查询应返回:2, 6, 10

2 个答案:

答案 0 :(得分:0)

[F5]解决方案(假设是sql server):

-- 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 

答案 1 :(得分:0)

此解决方案使用SQL-Server-Syntax(但仅AFAIK 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