View Full Version : انتخاب داده ها از دو Table بدون تکرار داده
  
مهدی رحیم زاده
جمعه 16 مرداد 1388, 18:05 عصر
سلام 
من دوتا Table دارم که یکی اطلاعات پرداخت ها رو نگه میداره و یکی اطلاعات دریافت ها.تنها فیلد مشترک اونا هم فیلد سال مالیه.
من میخوام این اطلاعات رو از اونا با این شرایط بیرون بکشم: 
تاریخ دریافت یا پرداخت ، عنوان دریافت یا پرداخت ، مبلغ پرداختی ، مبلغ دریافتی .
من اینا رو با هم Join می کنم و داده ا رو انتخاب می کنم اما یک مشکل هست! من میخوام جایی که تاریخ دریافت انتخاب میشه فیلد تاریخ پرداخت خالی باشه و به همین شکل.
یعنی وقتی من داده ها رو از Table اول انتخاب می کنم فیلد های مربوط به Table دوم خالی باشن و بلعکس در صورتی که اینجا با انتخاب من از هر Table فیلد های Table دیگه با داده های تکراری پر میشن.
ممنون میشم راهنماییم کنید.
با تشکر
محمد سلیم آبادی
جمعه 16 مرداد 1388, 18:32 عصر
به نظرم این روشی که شما می خواهید استفاده کنید جالب نیست. 
 
روش بهتر این است که ابتدا تمام سطرهای جدول دریافت ها را بدست آورید سپس با تمام سطر های جدول 
 
پرداخت ها UNION کنید. دیگه ستون های نتیجه query بیش از نیاز نخواهد بود.
afrooz_rahmati63@yahoo.com
جمعه 16 مرداد 1388, 18:42 عصر
از Left Outer Join  استفاده کنید.
محمد سلیم آبادی
جمعه 16 مرداد 1388, 19:01 عصر
SELECT  TarikhPardakht AS [Tarikh Pardakht/Daryaft],
          OnvanePardakht AS [Onvan Pardakht/Daryaft],
          MabjaghPardakhti AS [Mablagh Pardakhti/Daryaftee]
FROM dbo.pardakht
UNION ALL
SELECT TarikhDaryaft AS [Tarikh Pardakht/Daryaft],
          OnvaneDaryaft AS [Onvan Pardakht/Daryaft],
          MabjaghDaryafti AS [Mablagh Pardakhti/Daryaftee]
FROM dbo.daryaft
 
ID         SaleMalee  TarikhPardakht OnvanePardakht MabjaghPardakhti
---------- ---------- -------------- -------------- ----------------
p1         1          423            pp1            435       
p2         1          24             pp2            345       
p3         1          234            pp3            345       
p4         3          234            pp4            345       
 
(4 row(s) affected)
 
ID         SaleMalee  TarikhDaryaft OnvaneDaryaft MabjaghDaryafti
---------- ---------- ------------- ------------- ---------------
d1         1          321           dd1           342       
d2         1          2131          dd2           342       
d3         1          321           dd3           213       
d4         3          423           dd4           2423      
 
(4 row(s) affected)
 
Tarikh Pardakht/Daryaft Onvan Pardakht/Daryaft Mablagh Pardakhti/Daryaftee
----------------------- ---------------------- ---------------------------
423                     pp1                    435       
24                      pp2                    345       
234                     pp3                    345       
234                     pp4                    345       
321                     dd1                    342       
2131                    dd2                    342       
321                     dd3                    213       
423                     dd4                    2423      
 
(8 row(s) affected)
مهدی رحیم زاده
جمعه 16 مرداد 1388, 19:04 عصر
از Left Outer Join استفاده کنید. 
روش بهتر این است که ابتدا تمام سطرهای جدول دریافت ها را بدست آورید سپس با تمام سطر های جدول
پرداخت ها UNION کنید. 
میشه یه نمونه یا مثال برام بزارید؟
با تشکر
محمد سلیم آبادی
جمعه 16 مرداد 1388, 19:20 عصر
چرا فکر می کنید در این مورد شما باید از JOIN ( حالا از هر نوع اش) استفاده کنید ؟
 
یک نگاه به پست شماره چهار بی انداز.
محمد سلیم آبادی
جمعه 16 مرداد 1388, 19:41 عصر
اگر می خواهید جواب بگیرد باید حداقل همکاری را داشته باشید. مطالب پست اول کاملا شفاف نیست!
 
 
 
SELECT * FROM dbo.pardakht P
FULL OUTER JOIN dbo.daryaft D
ON P.SaleMalee=D.SaleMalee
 
ID         SaleMalee  TarikhPardakht OnvanePardakht MabjaghPardakhti
---------- ---------- -------------- -------------- ----------------
p1         1          423            pp1            435       
p2         2          24             pp2            345       
p3         3          234            pp3            345       
p4         4          234            pp4            345       
 
 
 
ID         SaleMalee  TarikhDaryaft OnvaneDaryaft MabjaghDaryafti
---------- ---------- ------------- ------------- ---------------
d1         1          321           dd1           342       
d2         2          2131          dd2           342       
d3         3          321           dd3           213       
d4         4          423           dd4           2423      
 
 
 
ID         SaleMalee  TarikhPardakht OnvanePardakht MabjaghPardakhti ID         SaleMalee  TarikhDaryaft OnvaneDaryaft MabjaghDaryafti
---------- ---------- -------------- -------------- ---------------- ---------- ---------- ------------- ------------- ---------------
p1         1          423            pp1            435              d1         1          321           dd1           342       
p2         2          24             pp2            345              d2         2          2131          dd2           342       
p3         3          234            pp3            345              d3         3          321           dd3           213       
p4         4          234            pp4            345              d4         4          423           dd4           2423      
 
(4 row(s) affected)
afrooz_rahmati63@yahoo.com
جمعه 16 مرداد 1388, 22:55 عصر
أقاي msalim راه بهتر را پیشنهاد دادند از Full Outer join استفاده کن.
آقای iranmsb اگر می خواهید از union استفاده کنید ستون های شما تعداد مشخص و مقادیرشان به صورت کامل از هر دو جدول پر می گردد.
ولیکن اگر بخواهید تمامی ستون ها را یعنی به طور مثال ستون پرداخت و ستون دریافت هر دو به طور همزمان موجود باشند ولی در آن واحد فقط یکی از ستون ها مقدار داشته باشد از Full outer join استفاده كنيد .البته همان طور که آقای msalim فرمودند با مثال بگید چی می خواهید تا بهترین و بهینه ترین روش را با کمک دوستان استفاده کنید.
بهنام بهمنی
شنبه 17 مرداد 1388, 09:26 صبح
دوستانی که join را پیشنهاد می دهند با درخواست نمی خواند , در خواست شده که در هر ردیف ستونهای یک جدول بیاید و ستونهای جدول دوم خالی بیاید .
در صورتی که در انواع join ردیفهایی که فیلد ارتباطی برابری دارند , از هر دو جدول می یند
مهدی رحیم زاده
یک شنبه 18 مرداد 1388, 22:58 عصر
دستتون درد نکنه درست درست بود.
حالا اگه بخوام که فیلد های پرداخت و دریافت رو به صورت جداگانه با همون داده ها انتخاب کنم طوری که هرجا پرداخت پر بود دریافت خالی باشه و هرجا که دریافت پر بود ، پرداخت خالی باشه باید چکار کنم . 
با تشکر
محمد سلیم آبادی
یک شنبه 18 مرداد 1388, 23:27 عصر
من باید علم از غیب داشته باشم تا جواب شما را بدهم!!
 
چون که هنوز یک بار هم داده هایتان و شکل و شمایل جداولتان را به ما نشان نداده اید!
 
ولی با این حال ما یک جواب احتمالی پست می کنیم.
 
 
SELECT  TarikhPardakht AS [Tarikh Pardakht],
        OnvanePardakht AS [Onvan Pardakht],
        MabjaghPardakhti AS [Mablagh Pardakhti],
            '' as [Tarikh Daryaft],
            '' AS [Onvan Daryaft],
            '' AS [Mablagh Daryaftee]
FROM dbo.pardakht
UNION ALL
SELECT '','','',TarikhDaryaft,
          OnvaneDaryaft ,
          MabjaghDaryafti 
FROM dbo.daryaft
 
نتیجه query فوق بعد از اجرا.
Tarikh Pardakht Onvan Pardakht Mablagh Pardakhti Tarikh Daryaft Onvan Daryaft Mablagh Daryaftee
--------------- -------------- ----------------- -------------- ------------- -----------------
423             pp1            435                                            
24              pp2            345                                            
234             pp3            345                                            
234             pp4            345                                            
                                                 321            dd1           342       
                                                 2131           dd2           342       
                                                 321            dd3           213       
                                                 423            dd4           2423      
 
(8 row(s) affected)
مهدی رحیم زاده
دوشنبه 19 مرداد 1388, 08:46 صبح
Msalim عزیز 
یک دنیا تشکر بابت این همه وقتی که برای سوالات نامفهوم بنده گذاشتی. جواب دقیقا همونی که شما گفتید. فقط زیاد از دست من ناراحت نشید ، گفتم که درحین کار سئوالات مختلفی برای انسان پیش میاد . 
آها !
میشه یک منبع خوب برای آموزش SQL معرفی کنی تا ما هم یه نموره مثل شما استاد عزیز چیز یاد بگیریم ؟
با تشکر
محمد سلیم آبادی
دوشنبه 19 مرداد 1388, 13:49 عصر
برای شروع، کتاب های ترجمه شده موجود در بازار خیلی مفید هستند. 
و بعد از این مرحله، مقاله های سایت های زیر خیلی عالی هستند.
www.simple-talk.com (http://www.simple-talk.com)
www.sqlserverventral.com (http://www.sqlserverventral.com)
www.sqlteam.com (http://www.sqlteam.com) این سایت یک فروم sql عالی است.
 
و اگر زبان انگلیسی ات در حد international هست می توانید سری کتاب های
 inside microsoft sql server T-SQL را مطالعه کنید
 
البته اینها همه پیشنهاد است ممکن است برای هر کسی یک مرجع مفید باشد!
 
select * from (
SELECT  TarikhPardakht AS [Tarikh Pardakht],
        OnvanePardakht AS [Onvan Pardakht],
        MabjaghPardakhti AS [Mablagh Pardakhti],
            '' as [Tarikh Daryaft],
            '' AS [Onvan Daryaft],
            '' AS [Mablagh Daryaftee]
FROM dbo.pardakht
UNION ALL
SELECT '','','',TarikhDaryaft,
          OnvaneDaryaft ,
          MabjaghDaryafti 
FROM dbo.daryaft) D
ORDER BY NEWID()
Tarikh Pardakht Onvan Pardakht Mablagh Pardakhti Tarikh Daryaft Onvan Daryaft Mablagh Daryaftee
--------------- -------------- ----------------- -------------- ------------- -----------------
24              pp2            345                                            
                                                 321            dd1           342       
234             pp4            345                                            
                                                 321            dd3           213       
423             pp1            435                                            
                                                 2131           dd2           342       
                                                 423            dd4           2423      
234             pp3            345                                            
 
(8 row(s) affected)
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.