我有一个表有一个描述数字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,但也许有一种方法可以在其他数据库上运行。
答案 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
的值达到10
。 level
随着每条记录而增加。
这是在Oracle
中生成任意长度的记录集的常用方法。
第二部分只选择level
的值(别名为num
以避免使用保留字),这些值不在您的表格中。
@Abdullah Dogan 提供了另一种使用MINUS
运算符执行此操作的方法。这样做也一样,但更清晰。