SQL 獲取連續編號中斷號的最小值

問題描述;返回最小的缺失數,要求一定是正數.
IF OBJECT_ID('dbo.T1') IS NOT NULL
  DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1
(
  keycol  INT         NOT NULL PRIMARY KEY CHECK(keycol > 0),
  datacol VARCHAR(10) NOT NULL
);
INSERT INTO dbo.T1(keycol, datacol) VALUES(3, 'a');
INSERT INTO dbo.T1(keycol, datacol) VALUES(4, 'b');
INSERT INTO dbo.T1(keycol, datacol) VALUES(6, 'c');
INSERT INTO dbo.T1(keycol, datacol) VALUES(7, 'd');


--方法1:case when ....end
select 
case when not exists(select * from T1 where keycol=1) then 1
else (select MIN(keycol) from T1 a  where not exists(select * from T1 where keycol=a.keycol+1))+1 end
--方法2;COALESCE(a,b)函數--具體翻MSDN吧
select coalesce(MIN(keycol+1),1)
from T1 a
where not exists(select * from T1 where keycol=a.keycol+1)
 and exists(select * from T1 where keycol=1)--這個EXISTS如果爲NULL where 條件爲假,那麼MIN(KEYCOL+1)得到一個NULL,那麼函數取第二個參數1
 --方法3:臨時表(這裏的臨時表產生方法我在後面會說,當然我之前第一次的學習筆記也有,有興趣的可以去翻翻)
select top 1 N
from T1 right join  NUM on T1.keycol=NUM.N--這裏的NUN表是一個從1-1000000的表
where   N<=(select MAX(keycol) from T1 ) and keycol is null
--方法4:表之間的OUTER JOIN
SELECT case when not exists(select * from T1 where keycol=1) then 1
else (select MIN(A.keycol + 1)
FROM dbo.T1 AS A
  LEFT OUTER JOIN dbo.T1 AS B
    ON B.keycol = A.keycol + 1
WHERE B.keycol IS NULL)end

發佈了20 篇原創文章 · 獲贊 9 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章