admin

在SQL表上获取未使用的唯一值

sql

我有一个表,该表的一列描述一个数字ID,该数字对于所有行都是唯一的(但它不是主键)。数字ID是有限的(假设答案的范围是1到10)

 SELECT ID FROM TABLE;
 ID
 ---
 1
 2
 5

我必须向用户展示(通过UI)未使用的值,以便为新输入选择正确的值。我知道如何在代码上进行操作(这是一个Grails
Web应用程序),只需从数据库中获取所有ID,然后生成一个列表,列出不存在的ID。但是我想知道是否有一种方法可以直接在SQL查询上执行。

因此,该查询应返回

ID
---
3
4
6
7
8
9
10

该数据库是Oracle,但也许有一种方法也可以在其他数据库上使用。


阅读 205

收藏
2021-06-07

共1个答案

admin

SELECT  num
FROM    (
        SELECT  level AS num
        FROM    dual
        CONNECT BY
                level <= 10
        )
WHERE   num NOT IN
        (
        SELECT  id
        FROM    mytable
        )

第一个子查询是对单行伪表的递归查询dual

它递归地选择记录,直到伪列的值level达到为止10level每条记录增加。

这是一种通用的生成记录集的方法,该记录集没有任何内容Oracle

第二部分仅选择表中尚未存在的那些值level(为num避免使用保留字而进行了别名)。

@Abdullah Dogan 提供了使用MINUS运算符执行此操作的另一种方法。这样做是一样的,但更容易理解。

2021-06-07