不在表中的所有缺失订单号的列表

Jac*_*ack 6 sql-server order-by except

我们的工作场所已开始扫描所有文件,而不是手动将它们保存在档案等中。

平均而言,我们每次扫描 1,000 个文档(每天大约发生 30 次)。

每次我们扫描 1,000 个文档时,我们都会收到少量的 OCR 错误/警告。

是否可以将最低和最高顺序号提供给变量并让 SQL Server 输出不在最低和最高顺序号之间的表中的所有缺失顺序号的列表?

例如

OCROrderNo
---------------
9001
9002
9006
9007
9008
9009
Run Code Online (Sandbox Code Playgroud)

最低编号 9001,最高编号 9009

MissingOrderNos
--------------------
9003
9094
9005
Run Code Online (Sandbox Code Playgroud)

附加信息

根据答案,这就是我正在尝试的:

DECLARE @Start INT = 1497389
        , @End INT = 1498264

SELECT @Start + N - 1
FROM   dbo.Numbers
WHERE  N <= ( 1 + @End - @Start )
EXCEPT
SELECT [ORDERNUMBER]
FROM   [dwdata].[dbo].[ORDERS]
ORDER BY [ORDERNUMBER] DESC
Run Code Online (Sandbox Code Playgroud)

导致:

消息 207,级别 16,状态 1,第 10 行
无效的列名“ORDERNUMBER”。


如果语句包含 UNION、INTERSECT 或 EXCEPT 运算符,则消息 104,级别 16,状态 1,第 10 行ORDER BY 项必须出现在选择列表中。

Mar*_*ith 10

首先创建一个大于您感兴趣的最大范围的辅助数字表。

CREATE TABLE dbo.Numbers
(
N INT primary key
);   


WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1),
    E02(N) AS (SELECT 1 FROM E00 a, E00 b),
    E04(N) AS (SELECT 1 FROM E02 a, E02 b),
    E08(N) AS (SELECT 1 FROM E04 a, E04 b),
    E16(N) AS (SELECT 1 FROM E08 a, E08 b),
    E32(N) AS (SELECT 1 FROM E16 a, E16 b),
cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY N) FROM E32)
INSERT 
INTO  dbo.Numbers
SELECT TOP(100000) N
FROM cteTally
OPTION (MAXDOP 1);
Run Code Online (Sandbox Code Playgroud)

然后查询很简单

DECLARE @Start INT = 9001
        , @End INT = 9009

SELECT @Start + N - 1 AS ORDERNUMBER
FROM   dbo.Numbers
WHERE  N <= ( 1 + @End - @Start )
EXCEPT
SELECT [ORDERNUMBER]
FROM   [dwdata].[dbo].[ORDERS]
ORDER BY [ORDERNUMBER] DESC
Run Code Online (Sandbox Code Playgroud)