PDA

View Full Version : سوال: پیدا کردن لیست کلید هایی که استفاده نشدند



Javad_raouf
یک شنبه 21 شهریور 1389, 15:21 عصر
سلام
فرض کنید یک جدول داریم که فیلدی از نوع عددی دارد و کلید است
البته Autonumber نیست و باید دستی عدد را وارد کنیم
رکورد هایی در این جدول ثبت شده است که در هر کدام این کلید مقدار منحصر به فردی دارد
مثل 1 و 3 و 7
حالا می خواهم با استفاده از دستوری لیست اعدادی که در هیچ رکوردی استفاده نشدند رو برگردونم
یعنی اعداد 2 و 4 و 5 و 6 و 8 و ... تا سقفی که تعیین شده

البته خودم یک چیزی به ذهنم می رسه ولی فکر می کنم خیلی اشتباه باشه
نظر من اینه که یک جدول بسازم تک فیلده و 5000 رکورد درونش بریزم از 1 تا 5000
فرض کنید اسم جدول اصلیم tblsanad هست که فیلد کلیدش cod_sanad است
و اسم جدولی که فقط یک فیلد به نام Cod دارد و از 1 تا 5000 را درونش ریختم adad است
بعد با این کد به هدفم می رسم:


select * from adad where cod not in(select cod_sanad from TblHesab_Mj)

با این کد به جوابم می رسم ولی به نظرم خیلی اشتباهه که یک جدول با 5000 رکورد بسازی برای یک کویری کوچولو:لبخند:
ممنون میشم اگر نظراتتون رو بفرمایید:قلب:

بهزادصادقی
دوشنبه 22 شهریور 1389, 03:13 صبح
قدم اول. کد زیر یک ساختار تست را ایجاد می نماید.



create table tblSanad( cod_sanad int primary key );
go

insert tblSanad select 1;
insert tblSanad select 2;
insert tblSanad select 5;
insert tblSanad select 7;
insert tblSanad select 8;
insert tblSanad select 9;
insert tblSanad select 13;
insert tblSanad select 14;
insert tblSanad select 18;
insert tblSanad select 19;
insert tblSanad select 20;
insert tblSanad select 21;
insert tblSanad select 26;
insert tblSanad select 56;
insert tblSanad select 58;
insert tblSanad select 61;
insert tblSanad select 71;
insert tblSanad select 81;
insert tblSanad select 88;
insert tblSanad select 89;
insert tblSanad select 90;
insert tblSanad select 91;

select * from tblSanad;


قدم بعدی: کد زیر احتمالا query ای می باشد که شما دنبالش هستید. بازه های خالی عددی شما را به صورت یک جدول که ارقام اول و آخر هر بازه را نشان می دهند درج می کند.



with x as
(
select
a.cod_sanad a,
b.cod_sanad b
from
tblSanad a
full outer join
tblSanad b
on
a.cod_sanad = b.cod_sanad -1
), preholes as
(
select
x.a,
y.b,
row_number() over( partition by x.a order by isnull(y.b, x.a) ) rn
from
x
join
x y
on
x.a < y.b
where
x.b is null
and y.a is null
)
select
a + 1,
b - 1
from
preholes p
where
rn = 1;


امیدوارم به درد شما بخورد.

ولی بگذارید بگویم. اینکه شما می خواهید این مشکل را حل کنید به من می گوید که طراحی دیتا بیس شما اشتباه است. چرا لازم است این کار را بکنید؟

Javad_raouf
دوشنبه 22 شهریور 1389, 11:06 صبح
مرسی تست می کنم خبرش رو میدم

ولی بگذارید بگویم. اینکه شما می خواهید این مشکل را حل کنید به من می گوید که طراحی دیتا بیس شما اشتباه است. چرا لازم است این کار را بکنید؟
من این رو واسه جدول حساب هام می خوام
می خوام کاربر بتونه کد حساب هر مشتری رو هر چیزی که دلش خواست بزاره
مثلا ممکنه با خودش بگه از رنج 1 تا صد مال مشتریانی که خوش حسابن و از 100 تا 200 مال بقیه
یا هر چیز دیگه (البته این نکته رو بگم که جدول گروه حساب گذاشتم برای تفکیک)
بعد می خوام دو تا عدد ازش بگیرم و لیست کد هایی که استفاده نشدند و مابین این دو عدد قرار دارند رو براش نشون بدم تا راحت تر باشه و هی کد تکراری نزنه و برنامه خطا بده
--------------------
ببخشید X و Y و a و b چی هستند؟

بهزادصادقی
دوشنبه 22 شهریور 1389, 11:41 صبح
مرسی تست می کنم خبرش رو میدم

من این رو واسه جدول حساب هام می خوام
می خوام کاربر بتونه کد حساب هر مشتری رو هر چیزی که دلش خواست بزاره
مثلا ممکنه با خودش بگه از رنج 1 تا صد مال مشتریانی که خوش حسابن و از 100 تا 200 مال بقیه
یا هر چیز دیگه (البته این نکته رو بگم که جدول گروه حساب گذاشتم برای تفکیک)
بعد می خوام دو تا عدد ازش بگیرم و لیست کد هایی که استفاده نشدند و مابین این دو عدد قرار دارند رو براش نشون بدم تا راحت تر باشه و هی کد تکراری نزنه و برنامه خطا بده
--------------------
ببخشید X و Y و a و b چی هستند؟

فلسفه های طراحی متفاوتی وجود دارد. در بعضی از این رویکردها که من ازشان استفاده می کنم، این اشتباه به حساب می آید که همچین ستونی (شماره حساب، قابل رویت به وسیله کاربر، قابل تعیین توسط بعضی از کاربرها) کلید اصلی یک جدول باشد. در عوض، پیشنهاد می شود که شما کلید اصلی خود را یک ستون از نوع identity قرار دهید و بعد ستون دومی هم به اسم شماره حساب اضافه کنید که کلید اصلی نیست، ولی رویش یک ایندکس داری از نوع unique.

برای کمی اطلاعات بیشتر، یک نگاهی هم به این پست می توانید بیاندازید:

http://barnamenevis.org/forum/showthread.php?t=246443

در مورد تکنیک استفاده شده در query، اجازه دهید اول ببینیم خود query کار می کند یا نه.

Javad_raouf
دوشنبه 22 شهریور 1389, 15:46 عصر
فلسفه های طراحی متفاوتی وجود دارد. در بعضی از این رویکردها که من ازشان استفاده می کنم، این اشتباه به حساب می آید که همچین ستونی (شماره حساب، قابل رویت به وسیله کاربر، قابل تعیین توسط بعضی از کاربرها) کلید اصلی یک جدول باشد. در عوض، پیشنهاد می شود که شما کلید اصلی خود را یک ستون از نوع identity قرار دهید و بعد ستون دومی هم به اسم شماره حساب اضافه کنید که کلید اصلی نیست، ولی رویش یک ایندکس داری از نوع unique.

ممنون از راهنماییتون
ولی منم دقیقا همین کار رو کردم و کلید اصلیم یک ستون دیگست
توی مثال پست اول گفتم کلید تا بفهمونم که نباید فیلد تکراری داشته باشه:لبخند:
البته اشتباه از من بود که بد گفتم

در مورد تکنیک استفاده شده در query، اجازه دهید اول ببینیم خود query کار می کند یا نه.
مرسی که وقت میزارید

بهزادصادقی
دوشنبه 22 شهریور 1389, 15:53 عصر
توی مثال پست اول گفتم کلید تا بفهمونم که نباید فیلد تکراری داشته باشه:لبخند:
البته اشتباه از من بود که بد گفتم


من تعجب می کنم. اگر شما دارید یک سوالی مطرح می کنید و انتظار دارید آدم ها از وقت گرانبهای خود مایه بگذارند تا جواب سوال شما را بدهند و کار شما را راه بیاندازند، حدافل کاری را که می توانید بکنید این است که اطلاعات غلط به ایشان ندهید. خود شما که می دانید یک ستون که کلید اصلی یک جدول است با یک ستون که ارزش هایش unique است از زمین تا آسمان هم فرق دارند، پس چرا عمدا می گویید ستون شما کلید است وقتی که کلید نیست و فقط unique است؟

Javad_raouf
پنج شنبه 08 مهر 1389, 14:39 عصر
من تعجب می کنم. اگر شما دارید یک سوالی مطرح می کنید و انتظار دارید آدم ها از وقت گرانبهای خود مایه بگذارند تا جواب سوال شما را بدهند و کار شما را راه بیاندازند، حدافل کاری را که می توانید بکنید این است که اطلاعات غلط به ایشان ندهید. خود شما که می دانید یک ستون که کلید اصلی یک جدول است با یک ستون که ارزش هایش unique است از زمین تا آسمان هم فرق دارند، پس چرا عمدا می گویید ستون شما کلید است وقتی که کلید نیست و فقط unique است؟
حق با شماست
عذر می خوام
ولی فکر نمی کنم این قضیه به سوال من ربط داشته باشه و اینقدر مهم باشه
اصلا فرض کنید فیلد من کلید است باز هم در سوال مشکلی پیش نمی آید

بهزادصادقی
جمعه 09 مهر 1389, 19:32 عصر
حق با شماست
عذر می خوام
ولی فکر نمی کنم این قضیه به سوال من ربط داشته باشه و اینقدر مهم باشه
اصلا فرض کنید فیلد من کلید است باز هم در سوال مشکلی پیش نمی آید

من از شما معذرت می خواهم. باید برای من واضح می بود که شما خود فکر نمی کردید که ذکر یا عدم ذکر آن مطالب تاثیری در جواب می گذارد، چون اگر فکر می کردید تاثیری می گذارد، حتما آن اطلاعات را ذکر می کردید.

ولی من به شما قول می دهم که صد در صد تاثیر می گذارد.