PDA

View Full Version : انتخاب یک سری عدد از بین یک مجموعه



مهدی رحیم زاده
جمعه 02 بهمن 1388, 06:45 صبح
سلام
دوستان عزیز من یک رنچ از اعداد دارم مثلا 1 تا 1000 . حالا یک سری از این اعداد درون یک جدول ذخیره شده .مثلا
2
5
6
4
100
258
350
980
990
حالا چطور میتونم دستوری بنویسم که اعداد باقی مانده این رنج رو برای بدست بیاره ؟
با تشکر

sia_2007
جمعه 02 بهمن 1388, 10:15 صبح
یه SELECT بنویس ؛ مثلا با ROW NUMBER از یک تا هزار را در بیار
سپس Except بگیر بین آن هزار تا و اعدادی که داری؛ بدین صورت :
مجموعه یک تا 1000
EXCEPT
مجموعه اعداد 255 23 11 160 956 و ...
دقیقا مثل UNION میمونه.
فقط عملکردش فرد میکنه.
نکته : فقط در 2005 و 2008

محمد سلیم آبادی
جمعه 02 بهمن 1388, 12:10 عصر
سلام،
شما نیاز به یک جدول اعداد دارین که از روش های متنوعی می توانین داده های این جدول را ایجاد کنین مثلا:
روش اول (http://www.barnamenevis.org/forum/showpost.php?p=874686&postcount=12) روش دوم (http://www.barnamenevis.org/forum/showpost.php?p=861660&postcount=2) و سوم

در مورد سوال اصلی، منطق پست شماره ی 2 کاملا درست است. اینجا هم نگاه کنین (http://www.barnamenevis.org/forum/showthread.php?t=193401)

مهدی رحیم زاده
جمعه 02 بهمن 1388, 21:13 عصر
میشه برام یک مثال بزنید؟
یک Query برای مثال بنویسید؟
با تشکر

محمد سلیم آبادی
شنبه 03 بهمن 1388, 12:39 عصر
ابتدا فرض می کنیم جدولی داریم که دارای 5 سطر با مقادیر 10 و 54 و 96 و 245 و 900 است. حالا می خواهیم مقادیری را از 1 تا 1000 بدست آوریم که در جدول مذکور وجود ندارند:
برای مثال من از cte های تو در تو (nested cte) استفاده کردم
عبارت جدولی t را جدول اصلی در نظر گرفته. d را جدول اعداد (digits) و result را جدول حاصل در نظر می گیریم داریم:


;with t as
(select i=10 union all
select 54 union all
select 96 union all
select 900 union all
select 245)

, d as
(select row_id
from (select row_number()over(order by (select 1))
from sys.columns) as d (row_id)
where row_id <= 1000)

, result as
(select *
from d
where not exists
(select *
from t
where d.row_id = t.i))

select *
from result

مهدی رحیم زاده
شنبه 03 بهمن 1388, 21:15 عصر
این توی 2000 هم جواب میده؟
آخه من نتونستم به نتیجه برسم .
با تشکر

محمد سلیم آبادی
شنبه 03 بهمن 1388, 22:01 عصر
کوئری قبلی به دلیل استفاده از تابع ranking قابل استفاده در نسخه 2000 نبود.
امتحان کنین:


;with t as
(select i=10 union all
select 54 union all
select 96 union all
select 900 union all
select 245)

, d1 as
(select i
from (select 0 union all
select 1 union all
select 2 union all
select 3 union all
select 4 union all
select 5 union all
select 6 union all
select 7 union all
select 8 union all
select 9) as d (i))
, d2 as
(select (d_1.i * 100) + (d_2.i * 10) + (d_3.i * 1) + 1 as i
from d1 as d_1
cross join d1 as d_2
cross join d1 as d_3)
, result as
(select *
from d2
where not exists
(select *
from t
where d2.i = t.i))

select *
from result
order by i asc

مهدی رحیم زاده
پنج شنبه 08 بهمن 1388, 20:38 عصر
میشه برام توضیح بدین که چطور باید از این کد ها استفاده کنم ؟
من میخوام با یک Query این کار رو انحام بدم ، میشه بازم راهنماییم کنید ؟
باتشکر

مهدی رحیم زاده
شنبه 10 بهمن 1388, 00:08 صبح
والا اینا که جواب نداد
من الان با حلقه این کار رو انجام میدم امازمان بره ، چطور این کار رو در کمترین زمان انجام بدم؟
با تشکر