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)
| 归档时间: |
|
| 查看次数: |
1015 次 |
| 最近记录: |