我们在训练记录上有一个自定义数字字段,该数字是按顺序记录的,但存在差距。我如何找到这些差距?考虑这个伪代码
SELECT MIN(X)
FROM DUAL
WHERE X BETWEEN 1 AND 999999
AND X NOT IN (SELECT AG_TRNID
FROM PS_TRAINING
WHERE AG_TRNID = X)
这不起作用,“X”未知。
谢谢!
布鲁斯
最佳答案
此答案假定您使用的是 Oracle。
解决此问题的方法是创建一个包含您范围内所有数字的结果集,然后加入该结果集。这样做的方法是使用递归查询:
SELECT LEVEL AS x
FROM DUAL
CONNECT BY LEVEL <= 999999
CONNECT BY
是特定于 Oracle 的语法,它告诉查询只要谓词为真就递归运行。 level
是一个伪列,只存在于使用 CONNECT BY
的查询中表示递归的级别。最终结果是该查询将针对双 999,999 次运行查询,每次都在递归中更深一层。鉴于这种生成数字的方法,将其插入您之前尝试过的查询中非常简单:
SELECT MIN (x)
FROM (SELECT LEVEL AS x
FROM DUAL
CONNECT BY LEVEL <= 999999)
WHERE x NOT IN (SELECT ag_trnid
FROM ps_training
WHERE ag_trnid = x)
关于sql - 如何找到一个不存在的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44390864/