تالار گفتمان مانشت
سوالی از دستور Exists - نسخه‌ی قابل چاپ

سوالی از دستور Exists - mahdikoochooloo - 18 دى ۱۳۹۰ ۱۲:۰۰ ق.ظ

به نام خدا
سلام رفقا
تو دستور Exists گیر کردم
به این مثال توجه کنید‌:
Select QTY from SP where exists(select * from S where S.S#=SP.S# AND QTY>1000)
سوال ‌: این دستور توسط SQL چطوری Trace می شه؟ اگر زحمت بکشید یک بار تریس کنید
مثلا به این شکل که SQL ابتدا رکورد اول رو از SP انتخاب می کنه و در Where چک می کنه که آیا این رکوردی که انتخاب شده دارای شروط مورد نظر است یا خیر؟
اگر شکل دستور رو تغییر بدیم به:
Select * from SP where exists(select * from S where S.S#=SP.S# AND QTY>1000)
آیا باز هم این دستور درست کار می کنه در صورتی که ما هیچ متغیری در سلکت اصلی قرار ندادیم که شرط Exists متوجه بشه کدوم رکورد مد نظر ماست
سوال سوم‌: آیا شرطی که داخل Exists است باید دارای متغیری باشد که جلوی Select اصلی آمده است ؟

با تشکر

RE: سوالی از دستور Exists - Processor - 17 تیر ۱۳۹۱ ۱۰:۰۸ ب.ظ

سلام

در مورد سوال اول:
ابتدا یک سطر از SP انتخاب میشه و برای اینکه این سطر در خروجی ظاهر بشه باید شرط Where مقدار True بگیره که چون شرط Where شامل دستور Exist هست، در صورتی مقدار True میگیره که مقداری برای Select داخلی برگشته باشه یعنی زمانی که حداقل یک تولید کننده وجود داشته باشه که اون قطعه رو تولید کرده و اینکه مقدار QTY بیشتر از ۱۰۰۰ باشه. اگه این شرط برقرار باشه، شرط Where درست میشه و اون سطر در خروجی ظاهر میشه و سطرهای بعدی SP به ترتیب بررسی میشن و در صورتی که شرط Where درست نباشه اون سطر نادیده گرفته میشه و سطرهای بعدی SP چک میشن.

در مورد سوال دوم هم باید بگم تنها تغییری که بوجود میاد در خروجی هست. و هیچ تاثیری روی شرط Exists نداره. در کوئری اول خروجی فقط مقدار QTY از جدول SP بود و در کوئری دوم همه مقادیر جدول SP در خروجی ظاهر میشه.
چون مقابل Select علامت * گذاشته شده یعنی تمامی خصیصه ها انتخاب شده و اینکه در کوئری دوم اسم خصیصه ها آورده نشده دلیلی نیس که نتونه تشخیص بده منظور ما کدوم خصیصه هست.

در مورد سوال سوم هم نیازی نیست که حتما مقداری که داخل Exists اومده رو در مقابل Select اصلی داشته باشیم. برای این مورد مثالهای زیادی وجود داره. (مقادیر مقابل Select فقط برای مشخص کردن مقادیر خروجی استفاده میشه و فقط در دستور Group by هست که مقدار مقابل Group by حتما باید قبلا مقابل Select بوده باشه.)