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

时间:2010-01-22 08:55:03

标签: sql oracle

我有一个表有一个描述数字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,但也许有一种方法可以在其他数据库上运行。

2 个答案:

答案 0 :(得分:6)

这可能会有所帮助,

select level lvl from dual connect by level<=10
minus
select id from table;

答案 1 :(得分:5)

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运算符执行此操作的方法。这样做也一样,但更清晰。