缺少系列

时间:2009-01-07 04:14:46

标签: sql-server

我在MS SQL中创建一个存储过程/函数,它应该返回缺少的序列。

示例:

表“orders”包含字段名称“ordNo”。

ordNo

000001

000003

000005

函数应该返回这些值:

000002

000004

任何想法?

非常感谢你。

3 个答案:

答案 0 :(得分:1)

如此简单的事情:

SELECT ordNo - 1
FROM Orders o
WHERE NOT EXISTS (
    SELECT *
    FROM Orders n
    WHERE n.ordNo = o.OrdNo - 1        
)
AND ordNo > 1

编辑:啊 - 这不会在系列中找到错过的“跑步”。只有一个缺失的数字。

这是一个我认为至少会找到“缺失”订单号的“从”和“到”值的版本:

SELECT (SELECT MAX(ordNo) + 1 FROM Orders m WHERE m.ordNo < o.OrdNo) fromOrdNo,
    (ordNo - 1) toOrdNo
FROM Orders o
WHERE NOT EXISTS (
    SELECT *
    FROM Orders n
    WHERE n.ordNo = o.OrdNo - 1        
)
AND ordNo > 1

答案 1 :(得分:0)

它的伪代码如下:

1.从00001开始

2.增加1并检查表中是否存在(ordNo)。

3.如果不存在,请返回该号码,否则重复该过程。

答案 2 :(得分:0)

以下示例可能会有所帮助。


-- the table that will have rows numbered from 1 to 1000
select top 1000 identity(int,1,1) as id into #X from syscolumns

-- the table with missing values
select top 200 identity(int,1,2) as id into #Y from syscolumns

-- select * from #x
-- select * from #y

select #x.id, #y.id from #x
left outer join #y on #x.id = #y.id
where  #y.id is null

你应该有一个像#x这样的临时表,它将包含所有值(包括行的最大值)。在上面的例子中,我假设范围是从1到1000。