PDA

View Full Version : حرفه ای: بدست اوردن اعداد حذف شده



Delphi&Kylix_2939
شنبه 14 آذر 1388, 01:43 صبح
با سلام
فرض اينكه ما از عدد 1تا 1000 داريم
ممكنه ميان اين اعداد چند تا حذفي داشته باشيم
حالا مي خواهيم select بزنيم حذفي ها رو نشون بده
يه راه خيلي ساده اينكه
از عدد 1 تا 1000 رو توي يك جدولي insert كني و بعد inner join بزني با اون جدولي كه اعداد رو داره كه در ركوردهاي سنگين كندي وحشتناكي رو شاهد خواهيم بود حالا يا براي اينكه از يه عدد تا يه عدد ديگه بجز Cursor بخوايم استفاده كنيم يا از تجربياتت دوستان استفاده كنيم
با تشكر

محمد سلیم آبادی
شنبه 14 آذر 1388, 04:37 صبح
سلام دوست عزیز،
در حقیقت مساله ای که شما از آن نام می برین یک مثلا معروفی است که به "جزیزه ها" یا "گپ" معروف است و تیتر آن به انگلیسی "Existing and Missing Ranges" نام داره.

روشی رو که خود پیشنهاد دادید می تواند به فرم زیر پیاده سازی شود فقط نیاز به یک جدول Number داریم که اونم قبلا با یکی از روش هایی که معرفی کردم ایجاد کردیم.



SELECT n FROM dbo.Nums
WHERE n BETWEEN (SELECT MIN(col1) FROM dbo.T1)
AND (SELECT MAX(col1) FROM dbo.T1)
AND NOT EXISTS(SELECT * FROM dbo.T1 WHERE col1 = n);


اما اگر می خواهین Missing Ranges را بدست آورین:



SELECT n + 1 AS start_range,
(SELECT MIN(n) FROM @t AS B
WHERE B.n > A.n) - 1 AS end_range
FROM @t AS A
WHERE NOT EXISTS
(SELECT * FROM @t AS B
WHERE B.n = A.n + 1)
AND n < (SELECT MAX(n) FROM @t)