سلام
فرض کنیم یک ستون داریم که داخل آن اعداد1تا1000 را ثبت می کنیم و در این بین چند عدد(100و350و470و..)ثبت نشده است چگونه می توانم این اعداد را بدست آورم
سلام
فرض کنیم یک ستون داریم که داخل آن اعداد1تا1000 را ثبت می کنیم و در این بین چند عدد(100و350و470و..)ثبت نشده است چگونه می توانم این اعداد را بدست آورم
در شرط توسط between بررسی کنید مقدار عدد بین 1 تا 1000 باشد و از not in هم برای عدم وجود میتونید استفاده کنید.
مورد 1:
اگه بخواهیم اولین عدد در بازه ی اعداد ثبت نشده رو بدست بیاریم:
select nbr+1from numbers n1
where not exists
(select *
from numbers n2
where n2.nbr = n1.nbr+1);
مورد 2:
اگه بخواهیم بازه ی اعداد ثبت نشده رو بدست بیاریم:
with temp as(
select *, row_number() over(order by nbr) as rnk
from numbers
)
select t1.nbr as begin_interval, t2.nbr as end_interval
from temp t1
join temp t2
on t1.rnk = t2.rnk - 1
and t1.nbr < t2.nbr - 1
مورد 3:
اگه بخواهیم لیست اعداد ثبت نشده رو بدست بیاریم. نیاز به یه جدول کمکی داریم که 1000 تا سطرداره از اعداد 1 تا 1000
من اسم این جدول رو میذارم temp و جدول اصلی رو number
کافیه از هم کمشون کنیم
select * from temp
except
select * from numbers
با تشکر
در مورد 2 کد را اینطور تغییر دادم
و پیام خطا زیر نمایش داده شدqryGorohShoSanadJadid.Close;
qryGorohShoSanadJadid.SQL.Clear;
qryGorohShoSanadJadid.SQL.Add('with temp as(');
qryGorohShoSanadJadid.SQL.Add('select *, row_number() over(order by Sanad) as rnk');
qryGorohShoSanadJadid.SQL.Add('FROM '+strSal+')');
qryGorohShoSanadJadid.SQL.Add('select t1.Sanad as begin_interval,t2.Sanad as end_interval');
qryGorohShoSanadJadid.SQL.Add('from temp t1');
qryGorohShoSanadJadid.SQL.Add('join temp t2');
qryGorohShoSanadJadid.SQL.Add('on t1.rnk = t2.rnk - 1');
qryGorohShoSanadJadid.SQL.Add('and t1.Sanad < t2.Sanad - 1');
qryGorohShoSanadJadid.Open ;
Untitled.png
نمیدونم والا