我们有一个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)
答案 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
假设帐户是数字,上面的查询将始终返回不存在的值