PDA

View Full Version : نوشتن کوئری شرطی بین 3 جدول



shervinrv
سه شنبه 25 شهریور 1393, 22:46 عصر
سلام دوستان
میخوام کل پروسه زیر رو تو یک کوئری بنویسم
ممنون میشم راهنماییم کنید
دو تامقدار دارم که تو متغیر به نام paye و class هستش
select id,name from studies where paye=@paye
select teacher from ttoclass where study=studies.id and class=@class
select name from users where id=ttoclass.teacher
توضیح کوئری بالا هم اینه
اول میرم تو جدول درس ها آیدی و نام تمامی درس هارو میگیرم که پایشون با مقدار متغیر paye برابره
بعد به ازای هر درس چک میکنه تو جدول ttoclass اگه ردیفی هست که مقدار class با متغیر class و مقدار study با آیدی ای که تو مرحله قبل گرفتیم برابر باشه وجود داره مقدار teacher اون ردیف رو بر میگردونه
حالا میره تو جدول users و مقدار name رو بر میگردونه که id اون ردیف برابر باشه با مقدار teacher تو مرحله قبل
و در نهایت باید مقادیر name از جدول studies و name از جدول users رو برگردونه

mohammad reza beizavi
سه شنبه 25 شهریور 1393, 22:54 عصر
درود بر شما
باید Join بزنید. اگر مقادیر یا همون ستونهای مشترک رو با کلید اصلی و کلید خارجی به هم ارتباط بدید استانداردرو رعایت می کنید. اما کوئری که می خواید اینجوریه:


Select studies.id, studies.name, ttclass.teacher, user.name
from studies
join ttclass on ttclass.study = studies.id
join users on users.id = ttclass.teacher
where ttclass.calss = @class

mohammad reza beizavi
سه شنبه 25 شهریور 1393, 23:00 عصر
البته اون فیلدهایی که در سوییچ ON با هم برابر می ذارید باید فیلدهایی باشند که منطقا نشانگر یا شناسه فیلدهای برابری از دو جدول هستند

shervinrv
چهارشنبه 26 شهریور 1393, 16:27 عصر
دوست عزیز خیلی ممنون از کمکتون
با راهنمایی شما کوئری رو نوشتم و کار میکنه
SELECT studies.studyname,users.name from school.dbo.users inner join
school.dbo.teachertoclass on users.id=teachertoclass.teacher inner join school.dbo.studies
on teachertoclass.study=studies.id and teachertoclass.class=2 where studies.paye=1

فقط الان یه مسئله
این کوئری فقط درصورتی مقدار بر میگردونه که با شرایط موجود users.name موجود باشه
وقتی این ستون از جدول users مقدار نداشته باشه مقدار studies.study رو که نال نیست رو هم بر نمیگردونه
من میخوام حتی اگه users.name نال بود studies.study رو برگردونه
و اگه بجای users.name خالی بتونه مقدار "ندارد" رو برگردونه که چه بهتر
بازم ممنون

mohammad reza beizavi
چهارشنبه 26 شهریور 1393, 17:28 عصر
بسیار خوب
برای اینکه تمام اطلاعات یه جدول رو در کوئری join داشته باشید حتی در صورتیکه ردیف معادلی در جدول مرتبط نداره می تونید از right join و left join استفاده کنید . اینطور به جای ستون هایی که در جدول مرتبط وجود ندارد مقدار null مشاهده می کنید.
در نمونه بالا شما می توانید به جای inner join ابتدایی از left join استفاده کنید و نتیجه رو ببینید.
برای نمایش یه مقدار به جای Null توی sql server هم میتونید از این روش استفاده کنید:


ISNULL(users.name, 'ندارد')

shervinrv
چهارشنبه 26 شهریور 1393, 17:34 عصر
ممنون دوست عزیز
درست شد.
خیلی لطف کردید