ورود

View Full Version : LEFT JOIN?



free
شنبه 15 تیر 1387, 11:16 صبح
سلام.خسته نباشید.
من با LEFT JOIN گزارشی گرفتم بین دو جدول که نتیجه را در یک QuickRep به چاپ میرسانم. به ازای هر رکورد از جدول یک چندین رکورد در جدول دوم قرار دارد.مثلا برای کد 10 از جدول یک در جدول دوم سه رکورد شامل نام و نام خانوادگی موجود است. برای چاپ اطلاعات یک رکورد از جدول یک گزارشی را با LEFT JOIN انجام داده و نتیجه بدون مشکل چاپ میشود.
اما حالا میخواهم چاپ کل رکوردهای جدول یک را همراه با اطلاعات جدول دوم داشته باشم.چطور دستورات را باید تغییر دهم که هر رکورد از جدول یک با اطلاعات مربوطه به خود در جدول دوم مرتبط شود و در چاپ مشکلی پیش نیاید؟

حمیدرضاصادقیان
شنبه 15 تیر 1387, 12:31 عصر
سلام.اگر مطمئن هستی که به ازای هر رکوردی که در جدول 1 هست رکورد متناظر اون در جدول 2 حتما وجود داره، میتونی از inner join استفاده کنی که سرعتش هم نسبت به join های دیگه بیشتره. ولی اکر ممکنه رکوردی در جدول 1 باشه که در جدول 2 زیر مجموعه ای نداره یا برعکس میتونی از full outer join استفاده کنی که دوطرف رو ساپورت کنه.
فقط دیگه اخر کوئری نباید از where استفاده کنی که یک رکورد خاص یا رکوردهای خاص رو بهت نمایش بده.
موفق باشی.

Hsimple11
شنبه 15 تیر 1387, 20:32 عصر
از آنجا که رکوردهایتان در دو جدول متناظر نیست پس نمیتوان از INNER JOIN استفاده کرد. با کلمه کلیدی OUTER JOIN، LEFT JOIN و حتی و یا SELECT می توانید تمام رکوردهایتان را در گزارش داشته باشید. در استفاده از LEFT JOIN به مشکلی بر نمیخورید.

حمیدرضاصادقیان
یک شنبه 16 تیر 1387, 07:33 صبح
از آنجا که رکوردهایتان در دو جدول متناظر نیست پس نمیتوان از INNER JOIN استفاده کرد. با کلمه کلیدی OUTER JOIN، LEFT JOIN و حتی و یا SELECT می توانید تمام رکوردهایتان را در گزارش داشته باشید. در استفاده از LEFT JOIN به مشکلی بر نمیخورید.

شما به این نکته توجه نکردین؟



به ازای هر رکورد از جدول یک چندین رکورد در جدول دوم قرار دارد.مثلا برای کد 10 از جدول یک در جدول دوم سه رکورد شامل نام و نام خانوادگی موجود است


در ضمن اگر رکورد متناظر نداشته باشه که همش null نمایش میده دوست عزیز!:چشمک:

free
یک شنبه 16 تیر 1387, 09:03 صبح
دوستان گرامی از راهنمایی تان متشکرم. اگه ممکنه بیشتر توضیح دهید.
کدی که نوشته ام برای یک رکورد بدین صورت است:

select * from
(select * from tabel1 where code=:p0 and name=:p1)b1
LEFT JOIN
(select * from tabel2 where code2=:p2) b2
ON b1.code=b2.code2

فرض کنید جدول یک نام پدر و جدول دوم شامل نام فرزندان وی میباشد. در QuickReport قسمت header نام پدر را قرار داده و در قسمت Detail نام فرزندان مربوطه را چاپ می نماید. حال می خواهم اطلاعات کل پدر هایی را که نامشان علی است همراه با نام فرزندانشان بصورت صفحه به صفحه و پشت سر هم به چاپ برسانم.چطور؟؟

حمیدرضاصادقیان
یک شنبه 16 تیر 1387, 14:39 عصر
سلام.فکر کنم با حذف این قسمت مشکل حل شود.


where code2=:p2) b2

با حذف این کد تمامی پدر ها با نام فرزندانشان را نمایش میده. ولی اگر میخوای فقط پدرانی که علی هست رو نمایش بده باید جلوی where به جای ستون code از فیلد نام استفاده کنی و بنویسی



where name like '%علی%'

این هم هرچی که نامش علی باشه و قبل و بعدش هرچی باشه برای شما میاره.

Hsimple11
یک شنبه 16 تیر 1387, 16:50 عصر
پست آخر این صفحه را ببینید :
http://barnamenevis.org/forum/showthread.php?t=112003

شما select خود را هم بر اساس کد و هم نام پدر در جدول یک انجام میدهید؟ فیلد Unique ای که برای Join استفاده میکنید چیست؟ یعنی دو نام پدر علی چگونه افتراق داده میشوند؟ code؟

فکر کنم با حذف این قسمت مشکل حل شود.
کد: where code2=:p2) b2

Select دوم در این صورت هیچ کابردی در این جا نخواهد داشت پس تمام آن را حذف کنید. LEFT JOIN رکوردهایی از جدول دوم را که متناظر آنها در جدول اول نباشد نمایش نمیدهد پس نیاز به Select کردن جدول دوم نیست.
اگر پدری هست که بچه ندارد! باید از LEFT JOIN استفاده کنید.


ولی اگر میخوای فقط پدرانی که علی هست رو نمایش بده باید جلوی where به جای ستون code از فیلد نام استفاده کنی
از چنین فیلدی استفاده شده :


(select * from tabel1 where code=:p0 and name=:p1)b1

پس مشکل Join حل شد . احتمالا مشکل اصلی شما در صفحه بندی باندها و گزارشتان است. درست است؟

free
دوشنبه 17 تیر 1387, 10:28 صبح
فکر کنم شما درست میگید.الان مشکل تو صفحه بندیه.فرض نمایید چنین گزارشی را می خوام چاپ کنم:

نام پدر: علی
نام فرزند ان:
1.احمد
2.محمد

نام پدر: محمد
1.ماهان
2.میترا
3.نینا

نام پدر: اکبر
1.مهیار
2.مهناز