PDA

View Full Version : join تو در تو و یا سه join همزمان



Sal_64
جمعه 26 مهر 1392, 19:41 عصر
سلام

آیا می توان از سه دستور Join بصورت همزان استفاده کرد
مثلا
a join b join c
و یا اینکه تو در تو باشند
یعنی
a join b) join c )

به چه صورت؟
تشکر

Sal_64
جمعه 26 مهر 1392, 22:56 عصر
سلام
توضیحات بیشتر داخل عکس ضمیمه ببینید
شاید اصلا نیازی به سه join متوالی نداشته باشد

fakhravari
شنبه 27 مهر 1392, 13:38 عصر
SELECT
B_Categories.*
, B_Forums.*
, B_Topics.*
FROM
B_Categories
INNER JOIN B_Forums
ON
B_Categories.CategoryID = B_Forums.CategoryID
INNER JOIN B_Topics
ON
B_Forums.ForumID = B_Topics.ForumID

Sal_64
شنبه 27 مهر 1392, 14:17 عصر
جناب سروان :لبخند:
ممنون آقا
ممکن بر طبق عکس پست دوم کمی راهنماییم کنی
تشکر

fakhravari
یک شنبه 28 مهر 1392, 17:40 عصر
:اشتباه: فقط اسم جدول , با اون شرط برابر id مورد نظر کن.

Sal_64
یک شنبه 28 مهر 1392, 17:51 عصر
:اشتباه: فقط اسم جدول , با اون شرط برابر id مورد نظر کن.
یک شماره کد نیست ، مجموعه ای از شماره کدهاست

Sal_64
دوشنبه 29 مهر 1392, 11:49 صبح
دوستان لطفا عکس ببینید
کسی میتونه راهنمایی کنه
تشکر

aslan
دوشنبه 29 مهر 1392, 14:30 عصر
سلام


SELECT Shomare, SUM(Bardasht) AS Bardasht, SUM(variz) AS Variz, Saheb
FROM (SELECT tblHesabha.Shomare, tblHesabha.Saheb, tblMobadelat.Mablagh AS Bardasht, 0 AS variz
FROM tblHesabha INNER JOIN
tblMobadelat ON tblHesabha.Shomare = tblMobadelat.Bardasht
UNION
SELECT tblHesabha.Shomare, tblHesabha.Saheb, 0 AS Bardasht, tblMobadelat.Mablagh AS variz
FROM tblHesabha INNER JOIN
tblMobadelat ON tblHesabha.Shomare = tblMobadelat.Variz) tmpUnion
GROUP BY Shomare, Saheb
ORDER BY Shomare

Sal_64
دوشنبه 29 مهر 1392, 15:25 عصر
سلام
یه دنیا تشکر
فقط من این شرط کجای این کوئری باید بذارم

where tblHesabha.Shomare in (1,2,5,6,11)

--
ببینید من تمام شماره حسابهایی که داخل شرط آورده شدن باید در گزارش نمایش بدم حتی اگر مقدار (مبلغ برداشت و واریز) هم نداشته باشند

aslan
دوشنبه 29 مهر 1392, 17:03 عصر
سلام



SELECT Shomare, SUM(Bardasht) AS Bardasht, SUM(variz) AS Variz, Saheb
FROM (SELECT tblHesabha.Shomare, tblHesabha.Saheb, tblMobadelat.Mablagh AS Bardasht, 0 AS variz
FROM tblHesabha INNER JOIN
tblMobadelat ON tblHesabha.Shomare = tblMobadelat.Bardasht
where tblHesabha.Shomare in (1,2,5,6,11)
UNION
SELECT tblHesabha.Shomare, tblHesabha.Saheb, 0 AS Bardasht, tblMobadelat.Mablagh AS variz
FROM tblHesabha INNER JOIN
tblMobadelat ON tblHesabha.Shomare = tblMobadelat.Variz
where tblHesabha.Shomare in (1,2,5,6,11)) tmpUnion

GROUP BY Shomare, Saheb
ORDER BY Shomare


و یا به این شکل


SELECT Shomare, SUM(Bardasht) AS Bardasht, SUM(variz) AS Variz, Saheb
FROM (SELECT tblHesabha.Shomare, tblHesabha.Saheb, tblMobadelat.Mablagh AS Bardasht, 0 AS variz
FROM tblHesabha INNER JOIN
tblMobadelat ON tblHesabha.Shomare = tblMobadelat.Bardasht

UNION
SELECT tblHesabha.Shomare, tblHesabha.Saheb, 0 AS Bardasht, tblMobadelat.Mablagh AS variz
FROM tblHesabha INNER JOIN
tblMobadelat ON tblHesabha.Shomare = tblMobadelat.Variz
) tmpUnion
where tmpUnion.Shomare in (1,2,5,6,11)
GROUP BY Shomare, Saheb
ORDER BY Shomare


احتمالا روش اول بهتره ................

aslan
دوشنبه 29 مهر 1392, 17:07 عصر
--
ببینید من تمام شماره حسابهایی که داخل شرط آورده شدن باید در گزارش نمایش بدم حتی اگر مقدار (مبلغ برداشت و واریز) هم نداشته باشند


بجای Inner Join
از
Left Outer Join
استفاده کنین
موفق باشین

Sal_64
دوشنبه 29 مهر 1392, 18:16 عصر
سلام
بازم هم تشکر
من به این روش کوئری کامل کردم و جواب گرفتم
آیا این راه صحیحه؟


select

d1.sh_hesab,
d1.tozihat,
isnull(d2.Bardasht,0) as Bardasht
isnull(d2.Variz,0)as Variz

from
(
select sh_hesab , tozihat
from daste_check where sh_hesab in (10,20,56,60)

)d1 left join
(
SELECT
sh_hesab,
SUM(Bardasht) AS Bardasht,
SUM(variz) AS Variz,
FROM
(SELECT
daste_check.sh_hesab,
mobadelat_hesabha.mablagh AS Bardasht,
0 AS variz
FROM daste_check
INNER JOIN
mobadelat_hesabha ON daste_check.sh_hesab = mobadelat_hesabha.sh_bardasht

UNION

SELECT
daste_check.sh_hesab,
0 AS Bardasht,
mobadelat_hesabha.mablagh AS variz
FROM daste_check
INNER JOIN
mobadelat_hesabha ON daste_check.sh_hesab = mobadelat_hesabha.sh_variz)

GROUP BY sh_hesab

)d2 on d2.sh_hesab=d1.sh_hesab

vahid_dadaism
دوشنبه 29 مهر 1392, 18:55 عصر
توصیه میشه بجای استفاده از join از selectهای تو در تو استفاده کنید. در تعداد بالای دیتا احتمالا با مشکل performance روبرو میشید

aslan
دوشنبه 29 مهر 1392, 19:41 عصر
سلام
بازم هم تشکر
من به این روش کوئری کامل کردم و جواب گرفتم
آیا این راه صحیحه؟


select

d1.sh_hesab,
d1.tozihat,
isnull(d2.Bardasht,0) as Bardasht
isnull(d2.Variz,0)as Variz

from
(
select sh_hesab , tozihat
from daste_check where sh_hesab in (10,20,56,60)

)d1 left join
(
SELECT
sh_hesab,
SUM(Bardasht) AS Bardasht,
SUM(variz) AS Variz,
FROM
(SELECT
daste_check.sh_hesab,
mobadelat_hesabha.mablagh AS Bardasht,
0 AS variz
FROM daste_check
INNER JOIN
mobadelat_hesabha ON daste_check.sh_hesab = mobadelat_hesabha.sh_bardasht

UNION

SELECT
daste_check.sh_hesab,
0 AS Bardasht,
mobadelat_hesabha.mablagh AS variz
FROM daste_check
INNER JOIN
mobadelat_hesabha ON daste_check.sh_hesab = mobadelat_hesabha.sh_variz)

GROUP BY sh_hesab

)d2 on d2.sh_hesab=d1.sh_hesab


سلام
هر چند جواب گرفتین ولی راه طولانی رفتین :
5 بار سلکت
3 بار جوین
union
, گروهبندی .................
مگه با query که من پیشنهاد کردم جواب نگرفتین ... اگر موضوع دیگه ای مطرح نیست کافیه در query اول پست 10 بجای دو تا inner join از دو تا left outer join استفاده کنین ...........
موفق باشین

Sal_64
دوشنبه 29 مهر 1392, 20:18 عصر
توصیه میشه بجای استفاده از join از selectهای تو در تو استفاده کنید. در تعداد بالای دیتا احتمالا با مشکل performance روبرو میشید
آیا استفاده از select های تو درتو بجای join خوانایی کوئری کم نمیکنه و در آینده گسترش پذیریش مشکل تر
تشکر

Sal_64
دوشنبه 29 مهر 1392, 20:20 عصر
سلام
هر چند جواب گرفتین ولی راه طولانی رفتین :
5 بار سلکت
3 بار جوین
union
, گروهبندی .................
مگه با query که من پیشنهاد کردم جواب نگرفتین ... اگر موضوع دیگه ای مطرح نیست کافیه در query اول پست 10 بجای دو تا inner join از دو تا left outer join استفاده کنین ...........
موفق باشین
سلام
تشکر
دلیل خاصی نداشت فقط قبل از جواب شما اون کوئری نوشته بودم
آیا کارایی یک کوئری با تعداد دستوراتش نسبت عکس داره ؟ اگر بله ،چه نوع دستوراتی؟
تشکر

vahid_dadaism
سه شنبه 30 مهر 1392, 14:42 عصر
خوب این سوالی هست که شما باید پاسخ بدید.
خوانایی کوئری رو میتونید با کامنت گذاشتن و اینجور چیزا درست کنید.
ولی اگر کوئری شما واسه تهیه گزارش یا اجرای یک ویو یا رویه ذخیره شده نیاز به 30 ثانیه وقت داشته باشه برای شما قابل قبول هست؟ 30ثانیه زمانیکه شاید بتونید اون رو به 20 ثانیه یا حتی کمتر کاهش بدید(بحث ایندکس و مباحث پیشرفته performance رو کاری ندارما. اعدادی که گفتم هم صرفا برای روشن شدن مثال هستند)
یکبار کوئری خودتون رو با دیتای زیاد با شیوه ای که من گفتم تو sql اجرا کنید و برنامه اجرایی این دو روش رو باهم مقایسه کنید. ببینید کدامیک سریعتر و با منابع کمتری اجرا میشن.(یادتون نره دیتا زیاد باشه..مثلا 1 میلیون یا بیشتر)