PDA

View Full Version : (فوری) ارتباط و گزارش



JavanSoft
سه شنبه 09 دی 1382, 11:41 صبح
فرض کنید 3 پایگاه به شکل زیر با ارتباط های مشخص شده داشته باشیم


حال می خواهیم یک دستور SQL بنویسیم که Name1, Name2, Name3 مرتبط با یکدیگر را به ما بدهد

Mahdavi
سه شنبه 09 دی 1382, 19:23 عصر
یکی از روشهاش :


select T1.Name1,T2.Name2,T3.Name3
from T1,T2,T3
where T1.F1 = T2.F1 and
T1.F1 = T3.F1

JavanSoft
چهارشنبه 10 دی 1382, 00:40 صبح
ممنون آقای مهدوی عزیز ... ولی این روش نمی تواند کمکی کند ... چرا که در این روش حاصلضرب رکورد ها بدست می اید مثلا اگر 2 رکورد در T1و 3 رکورد در T2 و 2 رکورد در T3 داشته باشیم حداکثر تعداد رکورد ها باید 3 باشد ..اما در جواب شما 10 خواهد بود

من کم کم دارم به این نتیجه می رسم که Sql نمی تواند این مساله را حل کند

phantasm
چهارشنبه 10 دی 1382, 04:16 صبح
سلام
چون نوشته بودی:

من کم کم دارم به این نتیجه می رسم که Sql نمی تواند این مساله را حل کند

برا همین غیرتی شدم یه کد من درآوردی نوشتم...
حالا ببین این روش مشکلت رو حل میکنه؟ :roll:




select T1.Name1,T2.Name2,T3.Name3 from T1
join T2 on (T1.Name1=T2.Name2)
join T3 on (T1.Name1=T3.Name3)

vadood
چهارشنبه 10 دی 1382, 10:01 صبح
حل شد یا نه؟

vadood
چهارشنبه 10 دی 1382, 10:14 صبح
SELECT
Name1, Name2, Name3
FROM
T1 INNER JOIN T2 ON T1.F1=T2.F1 INNER JOIN T3 ON T1.F1=T3.F1

hr110
چهارشنبه 10 دی 1382, 11:27 صبح
با سلام
ممکن است این جواب شما را کمی یاری کند ولی مطمئناً جواب نهایی نیست چونکه جوابهای تکراری در یک جدول را دو بار نمی آورد:


SELECT Name1 from T1,T2,T3
where (T1.F1=T2.F1)and(T1.F1=T3.F1)
union
SELECT Name2 from T1,T2,T3
where (T1.F1=T2.F1)and(T1.F1=T3.F1)
union
SELECT Name3 from T1,T2,T3
where (T1.F1=T2.F1)and(T1.F1=T3.F1)

JavanSoft
چهارشنبه 10 دی 1382, 15:16 عصر
1) از غیرت شما ممنون (آقای phantasm)
اما دستوری که فرمودید (Join کردن )بی فایده است چرا که همانگونه که در شکل مشاهده می کنید بین جدول 2و3 هیچ ارتباطی نیست
و Joinکردن باعث ایجاد یک رابطه Master/Detailمیگردد که اطلاعات را حتی نمایش نمی دهد

2) آقای vadood شما هم بهمچنین

3) اقای hr110
دستوری که شما فرمودید خوب است اما باعث میگردد که فیلدهای Name1,2,3در یک ستون قرار گیرند که این کار نتیجه را بی فایده می کند

4) شاید من در مورد نتیجه ای میخواهم توضیح نداده ام

نتیجه باید به این شکل باشد

vadood
چهارشنبه 10 دی 1382, 17:33 عصر
محمد جان
لطفا 3 تا table را بنویس (یعنی مثال بزن) و خروجی مورد علاقه ات را هم بنویس تا بهت بگم چی باید بنویسی

JavanSoft
پنج شنبه 11 دی 1382, 00:45 صبح
ممنون از توجه شما

فرض کنید محتویات 3 پایگاه به این صورت باشند

حال نتیجه باید به صورت 3 ستون طبق شکل بعدی باشد

JavanSoft
پنج شنبه 11 دی 1382, 12:34 عصر
کسی نظری نداره؟ :?

baabi
پنج شنبه 11 دی 1382, 15:39 عصر
سلام


select T1.name1 , T2.name2 ,T3.name3
where T1.F1=T2.F2 and T1.F1=T3.f3
union
select T1.name1 , "" ,T3.name3
where T1.F1<>T2.F2 and T1.F1=T3.f3
union
select T1.name1 , T2.name2 ,""
where T1.F1=T2.F2 and T1.F1<>T3.f3

البته شاید مجبور بشی که این حاصل رو توی یه جدول موقت ذخیره کنی ، ( راهی که برای یک سوال در سایت DBISAM به من گفته شد ) و از اون یه Select Distinct ساده بکنی

JavanSoft
جمعه 12 دی 1382, 00:38 صبح
baabi عزیز
1) " " در دستور به چه معناست
2) خودم هم دارم به این نتیجه می رسم که با یکبار پردازش نمی توان به این مطلب رسید ..اما تصور آن برایم مشکل است که چگونه با حلقه و یا دستورات متعدد دیگر بخواهم فیلد هایی را که تعدادشان نامشخص است را پر کنم

omidsm
جمعه 12 دی 1382, 14:33 عصر
ببین با این کد حل میشه 8)
SELECT T1.Name1, T1.F1, T2.Name2 Name2, T3.Name3, T2.F1, T2.F2, T3.F1, T3.F3
FROM "t1.db" T1
INNER JOIN "t3.db" T3
ON (T1.F1 = T3.F1)
LEFT OUTER JOIN "t2.DB" T2
ON (T3.F1 = T2.F1)
AND (T3.F3 = T2.F2)
البته به نظر بنده اون ارتباطهایی که در اول کشیده بودید درست نیست

JavanSoft
شنبه 13 دی 1382, 10:52 صبح
دوست عزیز ...نحوه ارتباط پایگاهها همانگونه که گفتم است
برای اطلاع بیشتر باید بگویم این ساختار سلسله مراتبی است و چیزی که شما بصورت ساده می بینید در واقع 7 طبقه ارتباط می باشد

vadood
شنبه 13 دی 1382, 10:53 صبح
SELECT
Name1, Name2, Name3
FROM
T3 INNER JOIN T1 ON T1.F1=T3.F1 LEFT JOIN T2 ON T2.F1=T1.F1

شما فیلد های f2 و f3 را بی دلیل گذاشتی. یا نتونستی مساله خودت را درست طرح کنی. این کوثری که من نوشتم خروجی دلخواه شما را بدون استفاده از این دو فیلد می ده. پس
1) این فیلد ها اضافی هستند
2) هنوز نفهمیدم مشکل شما چیه :?:

من فکر می کنم مورد اول درسته و شما تو طراحی table ها مشکل داری.

JavanSoft
شنبه 13 دی 1382, 13:25 عصر
1) از پاسخ گویی همه شما متشکرم
2) فیلدهای F2,F3بی دلیل نیستند
به این نوع طراحی طراحی سلسله مراتبی می گویند ... برای توضیح بیشتر به مقاله زیر مراجعه کنید

http://www.javan-soft.com/learning115.htm

در قسمت "انواع بانکهای اطلاعاتی "
حسن این نوع پیاده سازی انعطاف بالادر هنگام استفاده از Master /Detailها و Relationبصورت همزمان است

3) حتی با فرض اشکال در طراحی بایستی Sql بایستی بتواند چنین مساله ای را حل کند(چون Sql یک ساختار رابطه ای است )

vadood
شنبه 13 دی 1382, 13:32 عصر
به هر حال،

چیزی که من نوشتم نیاز شما را بر آورده می کند! نمی کند؟

JavanSoft
یک شنبه 14 دی 1382, 01:21 صبح
نه دوست عزیز ...جواب نمی دهد
من فکر میکنم باید یک کمی روش فکر کرد .... سعی میکنم جواب رابدست بیاورم
اگر شما هم یک بار دیگر مرور کنید ممنون می شوم

phantasm
یک شنبه 10 خرداد 1383, 11:51 صبح
سلام اقای Javan_Soft

میشه بفرمایید صورت اصلی مسیله چیست؟یعنی در واقعیت فیلد های f1,f2,f3 چیستند و کلید خارجی کدام است؟