विचार यह देखना है कि अंतराल कहां से शुरू होता है। मुझे लगता है कि आप SQL सर्वर 2012 का उपयोग कर रहे हैं, और इसलिए lag()
और lead()
कार्य। निम्नलिखित को अगला id
प्राप्त होता है :
select t.*, lead(id) over (order by id) as nextid
from t;
अगर गैप हो तो nextid <> id+1
. अब आप 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;
संपादित करें:
बिना lead()
, मैं सहसंबद्ध उपश्रेणी के साथ भी ऐसा ही करूंगा:
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;
id
मानते हुए टेबल पर प्राथमिक कुंजी है (या यहां तक कि इसमें केवल एक इंडेक्स है), दोनों विधियों में उचित प्रदर्शन होना चाहिए।