我有雇员表,其中主键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