找到不存在的值的最佳方法

时间:2017-05-12 14:00:52

标签: sql-server

我们有一个mssql表System.dbo.DirectMapping,它有一个已归档的帐户。不确定你是否看到了我的另一个问题,但它们并不是唯一的。在我问最好的方法来获得存在的帐户之前。现在我需要找到一个不存在的。我读了一种方法来生成从1到1000的数字,所以我的策略是在该范围内找到一个不在DirectMapping表中的数字。这有效,但很麻烦。我想知道是否有更方便的方法呢?

SELECT num from (
SELECT ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n as num
FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n),
 (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n),
 (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n),
 (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n)) j
where j.num not in (select account from System.dbo.DirectMapping)

4 个答案:

答案 0 :(得分:0)

这应该为你做的工作

with a as (
select  row_number() over(order by account) as rownum from System.dbo.DirectMapping)
select * from a
where rownum not in (select account from System.dbo.DirectMapping) and rownum <1000

OR

select a.rownum from (select  row_number() over(order by account) as rownum from System.dbo.DirectMapping) a
where a.rownum not in (select account from System.dbo.DirectMapping) and a.rownum <1000

使用帐号中小于1000的所有号码后,您可以替换

a.rownum <1000

 a.rownum >=1000 and  a.rownum <2000 

或您要检查的任何其他范围

如果有人来到这里试图在oracle中这样做,那就更简单了

    select rownum from System.dbo.DirectMapping 
where rownum <1000 and rownum not in (select account from System.dbo.DirectMapping)

答案 1 :(得分:0)

如果我理解你的问题。

假设AccountID是INT,并且您希望找到缺少的ID或间隙。

示例

Declare @YourTable table (AccountID int)
Insert Into @YourTable values
(1),(1),(5),(6),(7),(8),(9)   -- Notice 2,3,4 are missing in non-distinct list

Select MissingIDs = A.N
 From (
        Select Top (Select max(AccountID) from @YourTable) N=Row_Number() Over (Order By (select null)) 
        From  master..spt_values n1,master..spt_values n2
      ) A
 Left Join @YourTable B  on A.N=B.AccountID
 Where B.AccountID is null

返回缺少的帐户ID

MissingIDs
2
3
4

答案 2 :(得分:0)

另一个答案:

创建一个表accounts_temp,该表只有一列,所有数字都应该在DirectMapping表的帐户列中,并使用此列找到您缺少的

select min(account) from accounts_temp where account not in (
select account from System.dbo.DirectMapping)

答案 3 :(得分:-1)

 select max(account)+1
 from System.dbo.DirectMapping

假设帐户是数字,上面的查询将始终返回不存在的值