PDA

View Full Version : یه سوال در مورد نوشتن یک SQL



nasr
یک شنبه 07 تیر 1383, 10:14 صبح
سلام

من سه جدول دارم که شامل اسامی افراد است در هر جدولی یک سری اسم هست که ممکن است همون اسم در جدول دوم نیز وجود داشته باشه و شاید اسمی در جدول دوم باشه که در جداول دیگه نباشه و شاید در جدولها بعضی از اسامی تکراری هم باشه

حالا یه Query می خوام که تمام اسامی که در این سه جدول وجود داره را نشون بده همینطور تعداد تکرار هر اسم در جداول و مجموع اون اسم در هر سه جدول را

برای اینکه منظور من را بهتر متوجه بشید یه عکس را هم ضمیمه کرده ام (البته ببخشید که زیاد کلاسیک نیست)

با تشکر فراوان

JavanSoft
یک شنبه 07 تیر 1383, 13:37 عصر
از Union استفاده کنید

nasr
یک شنبه 07 تیر 1383, 14:59 عصر
میشه یه مثال بزنید

من هر روشی بلد بودم امتحان کردم

ممنون

(امید)
یک شنبه 07 تیر 1383, 17:38 عصر
سلام



select * from(
SELECT *
FROM (SELECT COUNT(fname) AS numbername, fname
FROM A
GROUP BY fname) b1 LEFT OUTER JOIN
(SELECT COUNT(fname) AS numbername, fname
FROM B
GROUP BY fname) b2 ON b1.fname = b2.fname
)b3
LEFT JOIN
(SELECT COUNT(fname) AS numbername, fname
FROM C
GROUP BY fname) b4
ON b3.fname = b4.fname


کد های بالا رو با RIGHT JOIN , CROSS JOIN هم امتحان کن

موفق باشی

nasr
دوشنبه 08 تیر 1383, 08:20 صبح
سلام

ببخشید A,B,C که جداول هستند این b1,b2,b3,b4 در دستور بالا چی هستند (اگه جداول هستند b4 چیه )

ممنون

(امید)
دوشنبه 08 تیر 1383, 11:02 صبح
سلام
این کد رو دوباره بررسی کردم . خواسته شما رو اونطور که می خواهید بر آورده نمی کنه . در ادامه شرح خواهم داد


SELECT COUNT(fname) AS numbername, fname
FROM A
GROUP BY fname

خوب در این دستور که مشکلی نیست . جدول فوق را ما b1 نام گذاری می کنیم . همینطور b2 , b4 را هم داریم . با این توجه ما دو جدول b1 , b2 را JOIN کردیم
یعنی :




SELECT *
FROM (SELECT COUNT(fname) AS numbername, fname
FROM A
GROUP BY fname) b1 RIGHT OUTER JOIN
(SELECT COUNT(fname) AS numbername, fname
FROM B
GROUP BY fname) b2 ON b1.fname = b2.fname


خروجی دستورات فوق اینه

جدول B -----جدول A
_________________
علی -- 1 -- علی --2
جواد -- 1 ---جواد ---2
مسعود -1 ------------
رضا ---1 ---رضا ---1
محمد --- 3 ---محمد --1

حالا کل حاصل بالا را b3 می نامیم و جدول b3,b4 را JOIN می کنیم یعنی



select * from(
SELECT *
FROM (SELECT COUNT(fname) AS numbername, fname
FROM A
GROUP BY fname) b1 RIGHT OUTER JOIN
(SELECT COUNT(fname) AS numbername, fname
FROM B
GROUP BY fname) b2 ON b1.fname = b2.fname
)b3
RIGHT JOIN
(SELECT COUNT(fname) AS numbername, fname
FROM C
GROUP BY fname) b4
ON b3.fname = b4.fname

که خروجی زیر را داریم:

جدول B -----جدول A ------- جدول C
_________________________________
-----------------------------محسن 1
رضا ---1 ---رضا ---1 --------رضا 1
-------------------------------امین 1
--------------------------------الهام 3
محمد --- 3 ---محمد --1-----محمد --3

3 نام زیر در نتیجه نهایی نخواهند آمد .
علی -- 1 -- علی --2
جواد -- 1 ---جواد ---2
مسعود -1 ------------

چرا که در جدول b4 ما رکوردهای علی و جواد درج نشده است .
اگر بخواهید عملیات فوق درست انجام شود باید در یکی از جداولتان تمام نام ها را داشته باشید.و این از خواص LEFT JOIN , RIGHT JOIN می باشد . مگر اینکه از CROSS JOIN استفاده کنید که در این حاصلضرب رکورد ها را خواهید داشت .

موفق باشید