Ý tưởng là để xem các khoảng trống bắt đầu từ đâu. Hãy để tôi giả sử bạn đang sử dụng SQL Server 2012 và do đó có lag()
và lead()
chức năng. Phần sau nhận được id
tiếp theo :
select t.*, lead(id) over (order by id) as nextid
from t;
Nếu có khoảng trống, thì nextid <> id+1
. Bây giờ bạn có thể mô tả các khoảng trống bằng cách sử dụng where
:
select id+1 as FirstMissingId, nextid - 1 as LastMissingId
from (select t.*, lead(id) over (order by id) as nextid
from t
) t
where nextid <> id+1;
CHỈNH SỬA:
Không có lead()
, Tôi sẽ làm điều tương tự với một truy vấn con tương quan:
select id+1 as FirstMissingId, nextid - 1 as LastMissingId
from (select t.*,
(select top 1 id
from t t2
where t2.id > t.id
order by t2.id
) as nextid
from t
) t
where nextid <> id+1;
Giả sử id
là một khóa chính trên bảng (hoặc thậm chí nó chỉ có một chỉ mục), cả hai phương pháp phải có hiệu suất hợp lý.