我有一个表,该表的一列描述一个数字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,但也许有一种方法也可以在其他数据库上使用。
SELECT num FROM ( SELECT level AS num FROM dual CONNECT BY level <= 10 ) WHERE num NOT IN ( SELECT id FROM mytable )
第一个子查询是对单行伪表的递归查询dual。
dual
它递归地选择记录,直到伪列的值level达到为止10。level每条记录增加。
level
10
这是一种通用的生成记录集的方法,该记录集没有任何内容Oracle。
Oracle
第二部分仅选择表中尚未存在的那些值level(为num避免使用保留字而进行了别名)。
num
@Abdullah Dogan 提供了使用MINUS运算符执行此操作的另一种方法。这样做是一样的,但更容易理解。
MINUS