PDA

View Full Version : سوال در مورد LEFT OUTER JOIN



bftarane
شنبه 16 اردیبهشت 1391, 16:28 عصر
سلام.
سلام. با توجه به دو جدول زير
Student
86698

Grade
86699

من متوجه نمي شم چرا نتيجه Query زير

Go
SELECT Grade.stNo, Grade.Grade, Fname, Lname
FROM Grade
LEFT OUTER JOIN Student
ON Student.stNo = Grade.stNo
WHERE Student.stNo >='17'
شکل زير شده. (منظورم اون قسمت Results هست)
86700
ميشه هر کسي که بلده توضيح بده.

من LEFT OUTER JOIN اي که شرط Where نداشته باشه رو متوجه ميشم.
ولي اين رو متوجه نميشم.
الآن فتح الله محمدي مشخصه که بايد در جواب باشه ولي علي علي زاده چرا جزو نتيجه اومده؟
در کتاب مهندس قمي و مهندس عباس نژاد اومده:
با اجراي اين دستورات، رکوردهايي از جدول Grade نمايش داده مي شوند که شماره دانشجويي آن ها بزرگتر يا مساوي 17 باشد و اين رکوردها با رکوردهاي سازگار جدول Student الحاق خواهند شد
خوب در مورد قسمت اول که شماره دانشجويي هايي بزرگتر يا مساوي 17 4 تا هستند که همشون هم 18 هستند (طبق جدول Student متعلق به
فتح اله محمدي)
خوب رکوردهاي سازگار جدول Student برداشت من اينه که برميگرده به قسمت
Student.stNo = Grade.stNo
شماره دانشجويي ها در جدول Grade
1, 2, 10, 18
حالا دنبال اينا تو جدول Student بگرديم اگه متعلق هستند به
رويا رضواني
علي علي زاده
رضا رضوي
فتح اله محمدي
خوب حالا از بين اينا چطوري علي علي زاده فقط انتخاب شده؟

mohsen.net
شنبه 16 اردیبهشت 1391, 19:31 عصر
این کویری در واقع تمام نمرات افراد با شماره دانشجویی بزرگتر از 17 را بر می گرداند
منم کلی گیج شدم چرا علی زاده را آورده

اما جواب در شرط نهفته است
Student.stNo >='17'

از quotation باید بفهمی که type فیلد stNo از نوع رشته هست نه عددی و رشته '2' بزرگتر از '17' است

Reza_Yarahmadi
شنبه 16 اردیبهشت 1391, 20:18 عصر
شرط شما و مقایسه ای که دارید انجام میدید بصورت رشته ای (Text) داره انجام میشه. در این نوع مقایسه ها ابتدا کاراکتر اول چک میشه اگر از کاراکتر اول شرط بزرگتر بود رکورد رو برمیگردونه ، اگر مساوی بود سراغ کاراکتر بعدی میره و در صورت کوچکتر بودن از رکورد میگذره.
در مثال شما کاراکتر 2 از کاراکتر 1 (مربوط به 17) بزرگتر ، در نتیجه رکورد رو برمیگردونه
نوع دادعه جدول شما رو نمیدونم ولی بصورت زیر امتحان کنید اگه خطا داد روش دوم رو امتحان کنید
WHERE Student.stNo >= 17
WHERE Cast(Student.stNo as Int) >= 17