تالار گفتمان مانشت
حل query هایی با شرط Exists - نسخه‌ی قابل چاپ

حل query هایی با شرط Exists - sal_dovomi - 22 بهمن ۱۳۸۹ ۰۳:۰۱ ب.ظ

سوال:
پایگاه داده با جداول زیر داده شده:
آنگاه شرح مناسب برای query روبه رو کدام گزینه است؟

branch(branch_name,branch_city,assets)
account(acc_number,branch_name,balance)
depositor(customer_name,acc_number)



select distinct S.customer_name
from depositor as S
where not exist((select branch_name
from branch
where branch_city='Brooklyn')
wxcept
(select R.branch_name
from deporistor as T,account as R
where T.account_number = R.account_number and S.customer_name=T.customer_name))


۱)اسامی مشتریانی را می دهد که در تمام شعب شهرbropklyn حساب باز کرده اند.
۲)اسامی مشتریانی را می دهد که در هیچ یک از شعب شهرbrooklyn حساب باز نکرده اند.
۳)اسامس مشتزیانی را میدهد که در شعب شهر brooklyn به صورت تکراری حساب باز کرده اند.
۴)اسامی مشتریانی را میدهد که در شعب شهر Brooklyn به صورت غیرتکراری حساب باز کرده اند.

دوستان این سوال چه جوری حل میشه؟اصلا این سوالایی که Exist داره قلقش چیه؟من اصلا نمیتونم حلشون کنم.

حل query هایی با شرط Exists - bijibuji - 22 بهمن ۱۳۸۹ ۰۸:۰۶ ب.ظ

این همون تقسیمه و گزینه ۱ صحیحه
Exist اگر حاصل جستجوی Select بعدش، تاپل داشته باشه، True بر می گردونه (همون Any سابقه)
این پرس و جو مشتری هایی رو بر می گردونه که در همه شعب شهر بروکلین حساب دارن

حل query هایی با شرط Exists - sepid - 22 بهمن ۱۳۸۹ ۱۱:۴۵ ب.ظ

با تشکر از توضیحات bijibuji من هم توضیحاتی اضافه میکنم.
برای هر اسم که در رابطه depositor وجود دارد ما باید مراحل داخل not Existرا انجام دهیم:
شعباتی که در شهر بروکلین واقعند رو به دست میاریم و شعباتی رو که این فرد در اون حساب داره رو ازش کم میکنیم.
چون شرط not exist هست پس اگر حاصل این تفریق هیچ تاپلی رو نتیجه نداد یعنی false شد پس اون اسم رو به عنوان جواب بر میگردونیم.
حالا در چه صورت حاصل false میشه؟
وقتی که شعباتی که این فرد در اون حساب داره برابر همه شعبات شهر بروکلین بشه.