PDA

View Full Version : چطور این سه جدول سند یک کوئری بسازم



swallow.pa
چهارشنبه 09 فروردین 1391, 18:48 عصر
سلام به همه
طبق عکس سه تا جدول دارم دو جدول پایه
1 اطلاعات افراد Person
2 اطلاعات شرکتها Company
و سومی که جدول نهائی است Sanad
حالا بعضی مواقع از جدول پرسن و کمپانی یکسری پرداختها انجام می شود که نهایتا یک فیلد PersonOrCompanyRef هست که نشون می دهد از چه کدی مربوط به کمپانی و پرسن استفاده شده حالا سوال من اینه
بنظر شما این روش درسته یا نه ؟ در صورت منفی بودن پیشنهاد شما چیه؟
در صورت درست بودن روش چطور یک کوئری از اینها بسازم
ممنونم

hamid_shrk
چهارشنبه 09 فروردین 1391, 19:45 عصر
سلام ،
درست بودنش به نظر من که درست اما برای کوئری گرفتن باید جدا جدا جوین کنی.
یعنی یکبار sanad و person رو باهم جوین کنی و یکبار هم sanad و company

swallow.pa
چهارشنبه 09 فروردین 1391, 20:50 عصر
دوست من حالا جدول رو اینجوری تغییر می دم طبق عکس
با فرض اینکه مثلا توی یک سند شماره 1 هم کمپانی ثبت می شه و هم پرسن
حالا چیکار کنم
ممنون

hamid_shrk
چهارشنبه 09 فروردین 1391, 21:08 عصر
طبق جواب قبلی من صورت سوال زیاد فرقی نکرد و الان شما باید بجای جدول sanad جدول sanadriz رو با دو جدول دیگه جوین کنی.
شما بفرمایید که چه اطلاعاتی رو میخواید از دیتابیس واکشی کنید؟

oliya24
پنج شنبه 10 فروردین 1391, 02:02 صبح
به نظر من این جداول 3 فرم نرمال رو نداره اگر نرمالش کنید به طور درست بهتر میشه موضوع رو درک کرد و راه چاره رو خیلی زودتردریافت

lastmory
پنج شنبه 10 فروردین 1391, 09:46 صبح
به نظر من دو تا فیلد اضافه کن توی جدول سند
یکی ObjectId و اون یکی ObjectTypeId
ObjectId ، آی دی ه رکورد مربوطه توی اون دو تا جدوله(همون PersonOrCompanyRef)
و ObjectTypeId مشخص میکنه حالا ای ObjectId از کدوم جدول اومده
با این روش برای سلکت کردن اطلاعات هم دو بار Join میزنی با این دو تا جدول ، با شرط ObjectType
مثال
Select A.* , B.CompanyName , C.Name From Sanad A
LEFT JOIN Company B ON A.ObjectId = B.CompanyId And A.ObjectTypeId = 1
LEFT JOIN Person C ON A.ObjectId = C.PersonId And A.ObjectTypeId = 2

swallow.pa
جمعه 11 فروردین 1391, 08:19 صبح
به نظر من این جداول 3 فرم نرمال رو نداره اگر نرمالش کنید به طور درست بهتر میشه موضوع رو درک کرد و راه چاره رو خیلی زودتردریافت
دوست من چطوری نرمالش کنم جدولها همینه می بینید ؟؟؟؟؟!!!!

swallow.pa
جمعه 11 فروردین 1391, 08:24 صبح
به نظر من دو تا فیلد اضافه کن توی جدول سند
یکی ObjectId و اون یکی ObjectTypeId
ObjectId ، آی دی ه رکورد مربوطه توی اون دو تا جدوله(همون PersonOrCompanyRef)
و ObjectTypeId مشخص میکنه حالا ای ObjectId از کدوم جدول اومده
با این روش برای سلکت کردن اطلاعات هم دو بار Join میزنی با این دو تا جدول ، با شرط ObjectType
مثال
Select A.* , B.CompanyName , C.Name From Sanad A
LEFT JOIN Company B ON A.ObjectId = B.CompanyId And A.ObjectTypeId = 1
LEFT JOIN Person C ON A.ObjectId = C.PersonId And A.ObjectTypeId = 2
دوست من تو جدول سند یا سند ریز ....
متوجه نشدم میشه توضیح بدید...
ممنون

lastmory
جمعه 11 فروردین 1391, 11:39 صبح
سلام منظورم توی خود جدول سند هستش
با این روش به جدول سندریز احتیاج نداری
84907
84908

swallow.pa
جمعه 11 فروردین 1391, 12:52 عصر
سلام منظورم توی خود جدول سند هستش
با این روش به جدول سندریز احتیاج نداری
84907
84908
دوست من به ریز سند نیاز هست
مثلا توی سند شماره 1 اگه یک رکورد مربوط به شرکت باشه و یک رکورد مربوط به افراد باشه چی ؟؟
یعنی سند 1 دو رکورد داره رکورد اول اشخاص که مبلغ و ... مربوط به خودش و رکورد بعدی مربوط به شرکت که اون هم مبلغ و .... مربوط به خودش رو داره ...
ب این توضیح بنظر شما چیکار کنم

lastmory
جمعه 11 فروردین 1391, 13:38 عصر
سلام دوست من ، فکر میکنم اینجوری قضیه حل شه

84914

swallow.pa
جمعه 11 فروردین 1391, 17:00 عصر
این کوئری رو طبق کد شما اینجوری نوشتم


SELECT A.SanadIdd, A.SanadIdH, A.ObjectTypeId, A.ObjectID, A.Price, B.CompanyName, C.Name
FROM dbo.SanadD AS A LEFT OUTER JOIN
dbo.Company AS B ON A.ObjectID = B.CompanyId AND A.ObjectTypeId = 1 LEFT OUTER JOIN
dbo.Person AS C ON A.ObjectID = C.PersonId AND A.ObjectTypeId = 2

اما نتیجه رو ببینید چیزی رو نمی بینم
توی قسمت نام و اسم شرکت

lastmory
جمعه 11 فروردین 1391, 18:24 عصر
:متعجب:
سلام
مطمئنی که توی جدول کمپانی و Person ، نام رو مقدار دادی
اصلا توی اون دو تا جدول رکوردی داری ؟؟؟؟؟
من همین کوئری رو تست میکنم جواب میده که

84927

این رکوردای جدول Company

84931

این رکوردای جدول Person


84930

این رکوردای جدول SanadH

84929

این رکوردای جدول SanadD

84928

swallow.pa
جمعه 11 فروردین 1391, 20:08 عصر
دوست من درست شد اشتباه از من بود
حالا سوال من اینه که اگه تعداد جدول پایه مثل شرکت - افراد و ... بیشتر باشه باز هم همین شرایطه درست می گم
و بالاخره سوال اخر اینه که بهترین راه همینه دیگه درسته
ممنون

lastmory
جمعه 11 فروردین 1391, 20:54 عصر
سلام
خوب خدا رو شکر که درست شد
البته این یکی از روشهایی ه که تست کردم خودم و نتیجه خوبی هم داشته
اما باید توجه کنی که این روش فقط موقعی کاربرد داره که مثل الان هر رکورد از جدول SanadD فقط مربوط به یکی از جداول Person یا Company باشه ، یعنی توی هر رکورد یا آی دی ه ، Company هست ، یا آی دی ه Person
حالا اگه میخوای یه جدول پایه دیگه ای هم اضافه کنی ، اگر همین شرایطو داره ، اول ObjectType شو اضافه میکنی ، بقیش هم فرقی با Company و Person نداره
اما اگه یه جدول پایه ای داری که این شرایطو نداره و میخوای توی SanadD ، در کنار ObjectId داشته باشیش ، خود فیلدشو اضافه کن
در آخر هم دوباره هر سوالی داشتی
در خدمتم
:لبخند:
دکمه تشکر رو هم بزن لطفا :لبخند:

swallow.pa
شنبه 12 فروردین 1391, 18:15 عصر
سلام
خوب خدا رو شکر که درست شد
البته این یکی از روشهایی ه که تست کردم خودم و نتیجه خوبی هم داشته
اما باید توجه کنی که این روش فقط موقعی کاربرد داره که مثل الان هر رکورد از جدول SanadD فقط مربوط به یکی از جداول Person یا Company باشه ، یعنی توی هر رکورد یا آی دی ه ، Company هست ، یا آی دی ه Person
حالا اگه میخوای یه جدول پایه دیگه ای هم اضافه کنی ، اگر همین شرایطو داره ، اول ObjectType شو اضافه میکنی ، بقیش هم فرقی با Company و Person نداره
اما اگه یه جدول پایه ای داری که این شرایطو نداره و میخوای توی SanadD ، در کنار ObjectId داشته باشیش ، خود فیلدشو اضافه کن
در آخر هم دوباره هر سوالی داشتی
در خدمتم
:لبخند:
دکمه تشکر رو هم بزن لطفا :لبخند:
ممنون دوست عزیز
من چند تا جدول دیگه هم دارم که دفیقا همین روال objectid رو دارن
بازم ممنون