sql - 如何找到一个不存在的数字?

标签 sql oracle

我们在训练记录上有一个自定义数字字段,该数字是按顺序记录的,但存在差距。我如何找到这些差距?考虑这个伪代码

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/

相关文章:

sql - 检索从前一天下午 6 点到今天下午 6 点的数据

database - HP Vertica,我们可以在 Windows 上安装它吗?我们用于 Oracle 的 SQL 与 HP Vertica 相同吗?

mysql - Oracle 语法 & 在自反关系中选择最大和最小行

Oracle 和 auto_increment/identity

sql - 用基于规则/声明式的实现替换关系数据库(SQL Server)?

java - 第二个结果集给出错误

php - 使用 PHP 创建 MSSQL 表时出现错误 ` Incorrect syntax near ' `'. `

sql - 在 VS2012 和 SSDT 中设置数据库图?

java - 为什么我只能从表中获取一条记录?

sql - Oracle SQL 更新语句以什么顺序更改列值?