一條SQL:補充缺失的最小ID

newknight發表於2013-11-28

ITPUB上碰到一個問題,覺得有點意思,順便就在部落格把解決思路列了下來。

原問題:
面試遇到一條SQL題,查詢被刪除的ID
大概意思是,有一張業務表,欄位ID為關鍵字標識每一張業務單,ID資料型別為int,正常情況下,每增加一條記錄,ID值增加1。
當表中某些記錄被刪除後,ID就會存在斷裂;如:表中原來10條記錄,當2,4,6 被刪除後,表中的內容如下:
—————————
|   ID                         |
—————————
|   1                          |
—————————
|   3                          |
—————————
|   5                          |
—————————
|   7                          |
—————————
|   8                          |
—————————
|   9                          |
—————————
|   10                        |
—————————

增加記錄時,查詢ID沒有被使用最小值,上例的查詢結果應該為2。
這個SQL如何寫呢?

個人解決思路如下:
建立測試表:
create table t (n number);

insert into t values(1);
insert into t values(3);
insert into t values(5);
insert into t values(7);
insert into t values(8);
insert into t values(9);
insert into t values(10);
commit;
select * from t;

SQL寫法如下:
with s as (
select 0 n,1 m from dual  –建立connect by的初始源
union
select n,n+1 m from t  –取出t表的下一ID
),
r as (
select s.*,level from s
 start with n=0  –從0開始connect by,出現斷層,即所需的ID號
 connect by  n=prior m )
select max(n)+1 from r;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10009036/viewspace-1061457/,如需轉載,請註明出處,否則將追究法律責任。

相關文章