ورود

View Full Version : بهینه و خلاصه کردن چند دستور select



محمد قانعی
دوشنبه 25 اسفند 1393, 16:57 عصر
با سلام.
من 4 جدول دارم. جدول اصلی شامل (شرح، مبلغ ،نوع کدبدهکار ،کد بدهکار ،نوع کد بستانکار،کدبستانکار)که نوع کد بدهکار نشون دهنده اسم 3 جدول دیگه است1-اشخاص 2-صندوق 3-بانک
3 جدول دیگه شامل جدول (اشخاص ، صندوق ، بانک) هست.
برای دستور select چند تا پارامتر میفرستم.
1-ستون جستجو(که میتونه شرح ،مبلغ،نام حساب بدهکار ،نام حساب بستانکار باشه )
2-چیزیکه باید توی ستون مورد نظر جستجو بشه(مثلا توی ستون شرح)
حالا توی دستور select میخوام جدول اصلی رو جوری نشون بدم که
1-جستجو بر اساس هر ستونی که بود بر اساس همون ستون جستجو کنه.
2-به جای ستون "نوع کد بدهکار" و" کد بدهکار" بیاد نام بدهکار رو از جدول مربوطه نشون بده.
مثلا توی نوع کد بدهکار اگه عدد 1 بود باید بره از جدول اشخاص اگه 2 بود از صندوق و اگه 3 بود از بانک نام بدهکار رو نشون بده.

من این جور مواقع معمولا از دستور if استفاده میکردم.ولی این جا خیلی پیچ در پیچ میشه.
اول باید ببینه که آیا توی جستجو اصلا چیزی فرستادم که بر اساس اون جستجو کنه یانه بعد اگه فرستادم ببینه بر اساس کدوم ستون جستجو کنه.
حالا در مورد نام بدهکار و بستانکار . اول باید ببینه کد بدهکار مربوط به کدوم جدول هست (نوع کد بدهکار )بعد نام بدهکار رو نشون بده
یعنی برای جستجو، 4 تا if و برای هر کدوم از این 4 تا ، 6تا if دیگه برای نام بدهکار و بستانکار
میشه 24 حالت (24 دستور select )

حالا از اساتید محترم خواهش میکنم اگه راه اصولی تر و بهینه تری هست بگن!

tiphooo
سه شنبه 26 اسفند 1393, 01:58 صبح
ایتدا این که بهتر بود نام جداول و فیلدها را ذکر میکردید
به فرض جدول اصلی شما T1 اشخاص T2 صندوق T3 بانک T4 است و جدول T1 تا T3 هر کدام دارای دو فیلد code,name می باشند
اسامی فیلدهای جدول T1 مثلا به صورت زیر نامگذاری شده اند
شرح F1
نوع کد بدهکار F2
کد بدهکار F3
نوع کد بستانکار F4
کد بستانکار F5
مبلغ F6
در اینصورت اگر یک پروسیجر برای جستجو بنویسید به شکل زیر خواهد بود

SELECT P.* FROM (SELECT *,
CASE
WHEN F2 =1 THEN
SELECT Name FROM T2 WHERE Code=T1.F3
WHEN F2 =2 THEN
SELECT Name FROM T3 WHERE Code=T1.F3
WHEN F2 =3 THEN
SELECT Name FROM T4 WHERE Code=T1.F3
END AS 'F7'
CASE
WHEN F4 =1 THEN
SELECT Name FROM T2 WHERE Code=T1.F5
WHEN F4 =2 THEN
SELECT Name FROM T3 WHERE Code=T1.F5
WHEN F4 =3 THEN
SELECT Name FROM T4 WHERE Code=T1.F5
END AS 'F8'
FROM T1)P
WHERE
((F1 Like '%'+ @F1 +'%') OR (F1 IS NULL AND @F1 IS NULL))
AND ((F3 = @F3 ) OR (F3 IS NULL AND @F3 IS NULL))
AND ((F5 = @F5 ) OR (F5 IS NULL AND @F5 IS NULL))
AND ((F6 = @F6 ) OR (F6 IS NULL AND @F6 IS NULL))
AND ((F7 Like '%'+ @F7 +'%') OR (F7 IS NULL AND @F7 IS NULL))
AND ((F8 Like '%'+ @F8 +'%') OR (F8 IS NULL AND @F8 IS NULL))




F1@ پارامتر ورودی فیلد شرح می باشد
F3@ پارامتر ورودی کد بدهکار می باشد
F5@ پارامتر ورودی کد بستانکار می باشد
F6@ پارامتر ورودی مبلغ می باشد
F7@ پارامتر ورودی نام بدهکار می باشد
F8@ پارامتر ورودی نام بستانکار می باشد

با کد فوق در صورتی که هر کدام از پارامترها مقدار داشته باشد بر اساس ان جستجو انجام میگیرد در غیر اینصورت جستجویی بر اساس ان صورت نمی گیرد

محمد قانعی
سه شنبه 26 اسفند 1393, 10:30 صبح
با سلام و خسته نباشید به همه بخصوص آقای tiphooo (http://barnamenevis.org/member.php?157500-tiphooo) .
واقعا عالی بود و من فهمیدم که توی select به جای if باید از case استفاده کرد!
فعلا به پارامتر های ارسالی کاری نداریم.

ایتدا این که بهتر بود نام جداول و فیلدها را ذکر میکردید
ای کاش براتون همون اول نام جداول و فیلدها رو میفرستادم تا این همه وقت تون گرفته نشه!
خب من نام جداول و فیلدها رو جایگزین کردم ولی کد ها کار نمیکنن !
دست راست تصویر جدول اصلی و تمام فیلد ها ش هست.باقی جدول ها رو هم فرض میکنیم که فقط دو فیلد code,name رو دارن.


129515


یه سئوال دیگه هم این که p چی هست و چیکار میکنه.
ممنون میشم راهنمایی کنید و اشکال کارم رو بگین.

محمد قانعی
سه شنبه 26 اسفند 1393, 11:34 صبح
سلام .
p رو حذف کردم و تمام دستورات select رو توی پرانتز گرفتم.درست شد.ولی نفهمیدم p چی بود.

129519

کلا خط 1 ایراد داشت.فقط
select * , نوشتم.

محمد قانعی
سه شنبه 26 اسفند 1393, 12:05 عصر
سلام و درود به همگی.
میریم سر وقت پارامتر ها.
من یکی "نوع جستجو" دارم به نام type_search و" جستجو" به نام search . که نوع جستجو شامل عدد 0 تا 3 میشه.یعنی اگه عدد صفر بود باید هر چی توی پارامتر جستجو بود با ستون شرح like بشه .اگه 1 بود جستجو توی مبلغ و همینجوری تا عدد 3.
حالا نمیتونم با دستور case درستش کنم.این هم کدهام.


WHERE
case
when @search_type=0 then
(sharh like @search+'%')

مگه تو قسمت where از دستور case نمیشه استفاده کرد؟

محمد قانعی
سه شنبه 26 اسفند 1393, 20:43 عصر
با سلام .
آقای tiphooo (http://barnamenevis.org/member.php?157500-tiphooo) کدهای عالی بود.دستتون درد نکنه.:تشویق:
فقط نمیدونم چرا f7 و f8 رو خطا میده، انگار فقط فیلد هایی رو که توی جدول هستن رو میشه استفاده کرد و f7 و f8 رو چون توی جدول نیستن خطا میده!:متفکر:



WHERE
((F1 Like '%'+ @F1 +'%') OR (F1 IS NULL AND @F1 IS NULL))
AND ((F3 = @F3 ) OR (F3 IS NULL AND @F3 IS NULL))
AND ((F5 = @F5 ) OR (F5 IS NULL AND @F5 IS NULL))
AND ((F6 = @F6 ) OR (F6 IS NULL AND @F6 IS NULL))
AND ((F7 Like '%'+ @F7 +'%') OR (F7 IS NULL AND @F7 IS NULL))
AND ((F8 Like '%'+ @F8 +'%') OR (F8 IS NULL AND @F8 IS NULL))

محمد قانعی
چهارشنبه 27 اسفند 1393, 10:29 صبح
سلام.
تونستم مشکل رو حل کنم.باید نام فرضی برای جدول می زاشتم مثل p

محمد قانعی
چهارشنبه 27 اسفند 1393, 11:05 صبح
سلام.
پارامتر های ارسالی این ها هستن


@sharh nvarchar(100)=null,
@money nvarchar(100)=null,
@bd nvarchar(100)=null,
@bs nvarchar(100)=null
اگه چیزی از سمت c# براشون فرستاده نشه مقدار null میگیرن.
حالا با این دستور where هیچ رکوردی بر نمیگرده!

WHERE
((sharh Like '%'+ @sharh +'%') OR (sharh IS NULL AND @sharh IS NULL))
AND ((money = @money ) OR (money IS NULL AND @money IS NULL))
AND (( name_bd Like '%'+ @bd +'%') OR (name_bd IS NULL AND @bd IS NULL))
AND ((name_bs Like '%'+ @bs +'%') OR (name_bs IS NULL AND @bs IS NULL))

از اساتید خواهش میکنم من رو راهنمایی کنند.

محمد قانعی
چهارشنبه 27 اسفند 1393, 11:28 صبح
درست شد.باید or میزاشتم.


WHERE
((sharh Like '%'+ @sharh +'%') OR (sharh IS NULL or @sharh IS NULL))
AND ((money = @money ) OR ( money IS NULL or @money IS NULL))
AND(( name_bd Like '%'+ @bd +'%') OR (name_bd IS NULL or @bd IS NULL))
AND ((name_bs Like '%'+ @bs +'%') OR (name_bs IS NULL or @bs IS NULL))

موفق و پیروز باشید.