PDA

View Full Version : مقادیر تکراری با inner join حتی ضمن استفاده از Distinct



محسن شامحمدی
یک شنبه 03 مهر 1390, 12:31 عصر
سلام بر دوستان.
من یک دیتابیس دارم که یک جدول داره به نام Parvandeha که توش پرونده افراد ثبت می شه.
و یکی دیگه به نام Morajeat که توش هر مراجعه ای از هر پرونده ای که میاد رو ذخیره می کنه.
حالا می خوام سلکت بزنم که تمام مراجعات رو لیست کنه ولی خب یک سری اطلاعات از جدول پرونده ها هم باید بیاد مثل نام شخص و فامیلش.
ضمنا فیلدی که این دوتا رو به هم مرتبط می کنه اسمش Shparvande هستش.یعنی شماره پرونده شخص.
نکته مهم قضیه:
فیلد drid که می شه دو هر دوتا جدول هست.
و نکته جالب اینه که اگر من این فیلد رو از Query ام حذف کنم دیگه نتیجه درست می شه ولی من واقعا به این فیلد نیاز دارم.
من Query ام رو اینطوری نوشتم:

select distinct morajeat.shparvande,morajeat.tarikhmoraje,pravande ha.drid,parvandeha.name,parvandeha.family from morajeat
inner join parvandeha on morajeat.shparvande=parvandeha.shparvande

اگر دستور Distinct رو بردارم که دقیقا دوبرابر تعداد واقعی بهم رکورد بر می گردونه ولی اگر اینو هم بذارم آمارش می شه 1/5 برابر تعداد رکورد واقعی.

یوسف زالی
یک شنبه 03 مهر 1390, 20:29 عصر
سلام.
تحلیل شما احتمالا درست نیست.
اگر به سریال جدول فرزند نیاز دارید از تکرار اجتنابی نیست.
در صورت استفاده از join هم تن به تکرار دادید اگر رابطه یک به چند باشه.
دقیقا چی می خواهید؟
اگر عکسی از خروجی می تونید بگذارید - این عکس رو دستی در paint هم می تونید بکشید یا اینکه در همون SQL ...

محسن شامحمدی
دوشنبه 04 مهر 1390, 09:46 صبح
ممنون از توجهتون.
با یک روش ابتکاری درستش کردم.

select morajeat.shparvande,morajeat.tarikhmoraje,pravande ha.drid,parvandeha.name,parvandeha.family from morajeat
inner join parvandeha on morajeat.shparvande=parvandeha.shparvande and morajeat.drid=parvandeha.drid

با اضافه کردن این کد به انتهای کوئری مشکل حل شد:
and morajeat.drid=parvandeha.drid
حتی دیگه نیازی هم به Distinct نیست.

mehran_sh_t
دوشنبه 04 مهر 1390, 10:12 صبح
سلام
مساله تون واسم جالب بود، میشه بگید drid چی رو نگه می داره؟ (و چرا تو هر دو تا جدول اومده؟)

محسن شامحمدی
چهارشنبه 06 مهر 1390, 08:45 صبح
سلام
مساله تون واسم جالب بود، میشه بگید drid چی رو نگه می داره؟ (و چرا تو هر دو تا جدول اومده؟)
کد پزشکی که این پرونده رو ثبت کرده. در Parvandeha
کد پزشکی که این بیمار رو ویزیت کرده. در Morjeat

mehran_sh_t
چهارشنبه 06 مهر 1390, 09:27 صبح
حالا می خوام سلکت بزنم که تمام مراجعات رو لیست کنه
پس الان با کد شما نباید تمام مراجعات رو نشون بده. درسته؟
به ازای هر بیمار فقط مراجعه اول رو نشون می ده به نظر...
کد اولتون هم به نظر درست میاد، نباید دو برابر بشه! اینو امتحان کنید

select morajeat.shparvande,morajeat.tarikhmoraje,morajeat .drid,parvandeha.name,parvandeha.family from morajeat
inner join parvandeha on morajeat.shparvande=parvandeha.shparvande