فرض کنید که یک جدول (یا کوئری)از همه اعداد مجاز long integer به اسم All_Numbers داشته باشیم:
minimum long integer = -(2^31) = -2,147,483,648
maximum long integer = 2^31 -1 = +2,147,483,647
البته منطقی نیست چون این جدول (یا کوئری) 4,294,967,296 رکورد خواهد داشت، ولی برای حل مسئله این فرض مشکلی ایجاد نمیکنه.
در اینصورت خیلی ساده کافی بود کوئری رو به شکل زیر میساختیم:
PARAMETERS Range_Start Long, Range_End Long;
SELECT N AS [Number]
FROM All_Numbers
WHERE N BETWEEN Range_Start AND Range_End;
که N اسم فیلد هست.
خب البته این کار شدنی نیست (منطقی و عملی) ،
ولی از ریاضی دبستان به یاد داریم که در سیستم شمارش دهدهی هر عددی را میتونیم با ارقام 0 تا 9 بسازیم،
به این صورت که دسته های یکی، ده تایی، سد تایی، هزار تایی، .... بسازیم (همون یکان، دهگان، سدگان، هزارگان، ...)
حالا کافی هست به جای یک جدول (کوئری) با بیش از 4 میلیارد رکورد،
برای هر دسته یک جدول (کوئری) فقط با 10 رکورد داشته باشیم. به عنوان مثال:
D با 10 رکورد از 0 تا 9
D10 با 10 رکورد از 0 تا 90
D100 با 10 رکورد از 0 تا 900
D1K با 10 رکورد از 0 تا 9000
D10K با 10 رکورد از 0 تا 90000
پس کوئری ما به شکل زیر میشه:
PARAMETERS Range_Start Long, Range_End Long;
SELECT (D.N + D10.N + D100.N + D1K.N + D10K.N) AS [Number]
FROM D,
D10,
D100,
D1K,
D10K
WHERE (D.N + D10.N + D100.N + D1K.N + D10K.N)
Between Range_Start And Range_End;
اما هنوز میتونیم کارها رو ساده تر کنیم،
به این صورت که فقط یک جدول(کوئری) D داشته باشیم ولی کوئری رو به شکل زیر بنویسیم:
PARAMETERS Range_Start Long, Range_End Long;
SELECT (D.N + 10*D10.N + 100*D100.N + 1000*D1K.N + 10000*D10K.N) AS [Number]
FROM D,
D AS D10,
D AS D100,
D AS D1K,
D AS D10K
WHERE (D.N + 10*D10.N + 100*D100.N + 1000*D1K.N + 10000*D10K.N)
BETWEEN Range_Start AND Range_End;