2016-12-05 64 views
2

我有僱員表,其中主鍵empl_no範圍從1到999.現在我想知道什麼primary_key仍然可用於添加新員工(S)。例如,下面的查詢返回值993.這意味着仍然有6個empl_no availavle尚未使用。如何使用Oracle SQL獲得這6個可用empl_no的列表?在此先感謝您的幫助:)如何在Oracle SQL表中獲取未使用/可用主鍵(主鍵範圍從1到999)的列表?

SELECT count(empl_no) 
FROM emplpyee 
WHERE empl_no BETWEEN 1 AND 999; 
+0

** primary_key的含義仍然可用**?你也知道'COUNT'是做什麼的嗎?請檢查[This](http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions032.htm) – Sami

+0

主鍵的點是永遠不會被重用,如果有6個失蹤它意味着在某個時間點可能刪除了6條記錄。無論如何,如果你真的想要這樣做,用999數字生成一個統計表,然後做一個左反連接將是最快/最簡單的方法之一,或者你可以查找間隙和島嶼,但計數是10倍更容易。 – Matt

+0

嗨薩米。感謝您的答覆。我想我知道COUNT的用法。在這裏使用COUNT,我只是想知道1到999之間的數字已經被使用了多少。在這種情況下,上述查詢的結果是993.這意味着999-993 = 1到999之間的6個數字仍可用於empl_no。如果令人困惑,請忽略「主鍵」問題。 – zilhaz

回答

3
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何時缺失。

這裏是一個鏈接,顯示甲骨文在飛行中創建一個數字表能力: http://rextester.com/CZDKC69208

+1

提示未經驗的讀者:這是一個反連接查詢。這只是另一種簡單的編寫方式'WITH cteNumbers AS(...)SELECT num FROM cteNumbers WHERE num NOT IN(SELECT empl_no FROM employee)'。 –

-2

我假設你的表是由一些列X,比empl_no.So其他y列找到一個可用的主鍵,您需要找到哪些是NULL列的X和Y(這意味着它們是空的)。下面的查詢可以幫助排..

SELECT empl_no FROM emplpyee WHERE columnX IS NULL和columnY IS NULL

+1

如果empl_no 567不在記錄集中,您的select語句將如何顯示567可用的OP?OP想要6個實際的數字empl_no號碼,在他的表 – Matt

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

沒有代表它的工作和腳本是很容易理解像我這樣的新手:)謝謝 – zilhaz

+0

@zilhaz - 一種提醒接受答案(通過標記* * V **標誌留給它) –

0

從所有可用ID中減去表中找到的所有ID。通過首先確定數字範圍(number(3)即您的案例中的0到999)創建所有可用的ID,然後遞歸創建該範圍內的所有數字。

在標準SQL中(以及在版本11.2中的Oracle中),您需要使用遞歸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; 
+0

這似乎是一種矯枉過正,但讓我們說一分鐘,這是必需的。 **(1)** empl_no最有可能是具有NULL data_precision的整數類型。 **(2)**如果數據精度爲12,我們是否會產生1,000,000,000,000行? –

+0

@Dudu Markovitz:我只是想展示如何動態獲取範圍。而且我的公司實際上甚至曾經有一個生產程序正在做這件事:找到代碼可以被重新使用的查找表的可用代碼。多年以後,真的發生了一些代碼範圍從'number(2)'擴展到'number(3)',並且程序在這些數據庫更改中工作得很好。是的,如果精度爲12,那麼可能會有許多可用的ID :-) –

+0

我可以將它與您剛纔描述的用例聯繫起來,但它與OP用例(甚至表名被改變...)。對於那些答案,我通常會添加一個帶有可以被其他人複製的工作代碼的小演示。附:返回間隙+使用的最大值將比生成1G值更有效。 –