如何在Oracle SQL表中获取未使用/可用的主键(主要键范围为1到999)的列表



我有雇员表,其中主键empl_no范围为1至999。现在我想知道哪些primary_key仍然可以使用新员工。例如,以下查询返回值993。这意味着仍然有6个empl_no avaivle尚未使用。如何使用Oracle SQL获取这6个可用empl_no的列表?预先感谢您的帮助:)

SELECT count(empl_no)
FROM emplpyee
WHERE empl_no BETWEEN 1 AND 999;
WITH cteNumbers AS (
    SELECT LEVEL AS NUM
    FROM DUAL
    CONNECT BY LEVEL <= 999
)
SELECT n.NUM
FROM
    cteNumbers n
    LEFT JOIN emplpyee e
    ON n.Num = e.empl_no 
WHERE
    e.empl_no IS NULL

再次不使用主键!但是,如果您真的想知道缺少的内容,请使用数字表。在Oracle中,他们可以轻松使用CONNECT BY。然后LEFT JOIN回到您的桌子,然后查找empl_no丢失时。

这是一个链接,该链接显示了Oracle即时创建数字表的能力:http://rextester.com/czdkc69208

select level from dual connect by level <= 999
minus
select empl_no from emplpyee 

从所有可用ID中找到所有可用ID中的所有ID。您可以首先确定数字范围(即number(3),即在您的情况下为0到999),然后递归创建该范围内的所有数字。

在标准SQL中(在Oracle中,版本11.2)您将使用递归CTE。

with all_ids(id) as
(
  select power(10, data_precision) - 1 as id from all_tab_cols 
    where owner = 'HR' and table_name = 'EMPLOYEES' and column_name = 'EMPLOYEE_ID'
  union all
  select id - 1 from all_ids where id > 0
)
select id from all_ids
minus
select employee_id from employees;

我假设您的表组成了某些列x,除了empl_no以外的列。(这意味着它们是空的)。BELOW查询可能会有所帮助。

从emplpyee中选择empl_no,其中columnx为null,columny为null

最新更新