PDA

View Full Version : انتخاب داده ها از دو Table بدون تکرار داده



مهدی رحیم زاده
جمعه 16 مرداد 1388, 17:05 عصر
سلام
من دوتا Table دارم که یکی اطلاعات پرداخت ها رو نگه میداره و یکی اطلاعات دریافت ها.تنها فیلد مشترک اونا هم فیلد سال مالیه.
من میخوام این اطلاعات رو از اونا با این شرایط بیرون بکشم:
تاریخ دریافت یا پرداخت ، عنوان دریافت یا پرداخت ، مبلغ پرداختی ، مبلغ دریافتی .
من اینا رو با هم Join می کنم و داده ا رو انتخاب می کنم اما یک مشکل هست! من میخوام جایی که تاریخ دریافت انتخاب میشه فیلد تاریخ پرداخت خالی باشه و به همین شکل.
یعنی وقتی من داده ها رو از Table اول انتخاب می کنم فیلد های مربوط به Table دوم خالی باشن و بلعکس در صورتی که اینجا با انتخاب من از هر Table فیلد های Table دیگه با داده های تکراری پر میشن.
ممنون میشم راهنماییم کنید.
با تشکر

محمد سلیم آبادی
جمعه 16 مرداد 1388, 17:32 عصر
به نظرم این روشی که شما می خواهید استفاده کنید جالب نیست.

روش بهتر این است که ابتدا تمام سطرهای جدول دریافت ها را بدست آورید سپس با تمام سطر های جدول

پرداخت ها UNION کنید. دیگه ستون های نتیجه query بیش از نیاز نخواهد بود.

afrooz_rahmati63@yahoo.com
جمعه 16 مرداد 1388, 17:42 عصر
از Left Outer Join استفاده کنید.

محمد سلیم آبادی
جمعه 16 مرداد 1388, 18: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, 18:04 عصر
از Left Outer Join استفاده کنید.

روش بهتر این است که ابتدا تمام سطرهای جدول دریافت ها را بدست آورید سپس با تمام سطر های جدول

پرداخت ها UNION کنید.
میشه یه نمونه یا مثال برام بزارید؟
با تشکر

محمد سلیم آبادی
جمعه 16 مرداد 1388, 18:20 عصر
چرا فکر می کنید در این مورد شما باید از JOIN ( حالا از هر نوع اش) استفاده کنید ؟

یک نگاه به پست شماره چهار بی انداز.

محمد سلیم آبادی
جمعه 16 مرداد 1388, 18: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, 21:55 عصر
أقاي msalim راه بهتر را پیشنهاد دادند از Full Outer join استفاده کن.
آقای iranmsb اگر می خواهید از union استفاده کنید ستون های شما تعداد مشخص و مقادیرشان به صورت کامل از هر دو جدول پر می گردد.
ولیکن اگر بخواهید تمامی ستون ها را یعنی به طور مثال ستون پرداخت و ستون دریافت هر دو به طور همزمان موجود باشند ولی در آن واحد فقط یکی از ستون ها مقدار داشته باشد از Full outer join استفاده كنيد .البته همان طور که آقای msalim فرمودند با مثال بگید چی می خواهید تا بهترین و بهینه ترین روش را با کمک دوستان استفاده کنید.

بهنام بهمنی
شنبه 17 مرداد 1388, 08:26 صبح
دوستانی که join را پیشنهاد می دهند با درخواست نمی خواند , در خواست شده که در هر ردیف ستونهای یک جدول بیاید و ستونهای جدول دوم خالی بیاید .
در صورتی که در انواع join ردیفهایی که فیلد ارتباطی برابری دارند , از هر دو جدول می یند

مهدی رحیم زاده
یک شنبه 18 مرداد 1388, 21:58 عصر
دستتون درد نکنه درست درست بود.
حالا اگه بخوام که فیلد های پرداخت و دریافت رو به صورت جداگانه با همون داده ها انتخاب کنم طوری که هرجا پرداخت پر بود دریافت خالی باشه و هرجا که دریافت پر بود ، پرداخت خالی باشه باید چکار کنم .
با تشکر

محمد سلیم آبادی
یک شنبه 18 مرداد 1388, 22: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, 07:46 صبح
Msalim عزیز
یک دنیا تشکر بابت این همه وقتی که برای سوالات نامفهوم بنده گذاشتی. جواب دقیقا همونی که شما گفتید. فقط زیاد از دست من ناراحت نشید ، گفتم که درحین کار سئوالات مختلفی برای انسان پیش میاد .
آها !
میشه یک منبع خوب برای آموزش SQL معرفی کنی تا ما هم یه نموره مثل شما استاد عزیز چیز یاد بگیریم ؟
با تشکر

محمد سلیم آبادی
دوشنبه 19 مرداد 1388, 12: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)