PDA

View Full Version : کوئری بانک



soroushp
سه شنبه 08 آذر 1390, 14:17 عصر
deposit(c_name,b_name,account) primary key:account,foreign key:(c_name,b_name)
customer(c_name,c_city) p.k:c_name
branch(b_name,b_city) p.k:b_name
select c_name,c_city from customer where c_name not in(select c_name from deposit where b_name in(select b_name from branch where b_city in(select b_city from branch)))

کوئری: نام و نام شهر مشتریانی که در شعبه شهر خود حساب ندارند؟؟؟
من اینو نوشتم جواب نداد لطفا کمک کنید

soroushp
سه شنبه 08 آذر 1390, 14:23 عصر
من در ابتدا یک سینا ، تهران در جدول customer وارد کردم،و آزادی ، شیراز در جدول branch.در جدول deposit سینا ،آزادی ،1 رو وارد کردم که موقع خروجی باید سینا ، تهران رو بیاره که نمیاره

یوسف زالی
سه شنبه 08 آذر 1390, 17:15 عصر
سلام.
در رابطه با نرمال بودن جداولتون مطمئن نیستم. به هر حال من توضیح فارسیشو می دم :


نام و نام شهر مشتریانی که

این یعنی بیرونی ترین سلکتتون رو باید از مشتریان بگیرید.
مثلا:
select * from Customer


در شعبه شهر خود + حساب

این یعنی نیاز هست ارتباطی بین شعبات و مشتریان و حساب ها به طور همزمان ایجاد بشه.
مثلا:
select * from Customer join Deposite on Customer.C_Name = Deposite.C_Name join Branch on Deposite.B_Name = Branch.B_Name


ندارند

حالا ارتباط این دو تا رو در میاریم.
می دونیم که مشتریانی که اول سلکتشون کردیم همونایی هستند که در سلکت دوم آوردیمشون.
بنابراین می تونیم به جای فیلتر کردن هردو بیایم و یک ارتباط بینشون برقرار کنیم.
راه بهترش اینه که جداول درونی رو به جای ارتباط با مشتریان درونی مستقیم با مشتریان بیرونی مرتیط کنیم.
مثال:
select * from Customer where not exists( -- sql
select * from Deposite join Branch on Deposite.B_Name = Branch.B_Name where Customer.C_Name = Deposite.C_Name ) -- sql

و به این شکل سریعترش می کنیم:
select * from Customer where not exists( -- sql
select top 1 1 from Deposite join Branch on Deposite.B_Name = Branch.B_Name where Customer.C_Name = Deposite.C_Name ) -- sql

موفق باشید.

soroushp
سه شنبه 08 آذر 1390, 18:06 عصر
select * from Customer where not exists( -- sql
select * from Deposite join Branch on Deposite.B_Name = Branch.B_Name where Customer.C_Name = Deposite.C_Name ) -- sql

و به این شکل سریعترش می کنیم:
select * from Customer where not exists( -- sql
select top 1 1 from Deposite join Branch on Deposite.B_Name = Branch.B_Name where Customer.C_Name = Deposite.C_Name ) -- sql

موفق باشید.

سوالم این بود که در شعب شهر خود حساب ندارند، شما join درسته اما چرا customer.c_name=deposit.c_name کردی ؟؟؟
به نظرت درسته؟

soroushp
سه شنبه 08 آذر 1390, 18:13 عصر
از نظر منطقی دستورات به ظاهر درسته، اما جواب نمیده!!

soroushp
سه شنبه 08 آذر 1390, 18:21 عصر
شایدم من تو وارد کردن اطلاعات دچار مشکل شدم، اینطوری وارد کردم:

customer: علی، تهران /////// branch: آزادی،قزوین ////////// deposit : علی ، آزادی ،1
customer: مجید، تهران /////// branch: انقلاب،تهران ////////// deposit : مجید ، انقلاب ،2
الان مطمئنا باید ali تو خروجی ظاهر بشه که ....×