PDA

View Full Version : کمک در کوئری



silver2000
جمعه 11 بهمن 1392, 10:09 صبح
سلام دوستان عزیزم.
من یه جدول (LetterId( LetterId, SenderId, ReciverId,CCId دارم هم چنین یه جدول
OrgPerson(OrgPerson,FirstName,LastName) . در واقعع جدول نامه شامل آی دی فرستنده و گیرنده و رونوشت میشه . من میخوام این دوتا جدول رو با هم join کنم تا بتونم اسم فرستنده ، گیرنده و رونوشت رو داشته باشم .میخواستم از Inner Join استفاده کنم اما با مشکل مواجه شدم .دوستان اگر میتونید راهنماییم کنید .پیشاپیش مرسیییی :قلب: :قلب: :بوس: :بوس:

espootin
جمعه 11 بهمن 1392, 11:36 صبح
با سلام

* با فرض اینکه SenderId, ReciverId,CCId هر سه کلید خارجی از جدول OrgPerson می باشند.

جواب شما بصورت زیر خواهد بود:


select LetterId, SenderId , o1.FirstName as SenderFName, o1.LastName as SenderLName,
ReciverId ,o2.FirstName as ReceiverFName, o2.LastName as ReceiverLName,
CCId, o3.FirstName as CCIdFName, o3.LastName as CCIdLName
from dbo.letterId as l
inner join dbo.OrgPerson as o1
on l.SenderId = o1.OrgPerson
inner join dbo.OrgPerson as o2
on l.ReciverId = o2.OrgPerson
inner join dbo.OrgPerson as o3
on l.CCId = o3.OrgPerson;


موفق باشید./

silver2000
جمعه 11 بهمن 1392, 15:59 عصر
با سلام

* با فرض اینکه SenderId, ReciverId,CCId هر سه کلید خارجی از جدول OrgPerson می باشند.

جواب شما بصورت زیر خواهد بود:


select LetterId, SenderId , o1.FirstName as SenderFName, o1.LastName as SenderLName,
ReciverId ,o2.FirstName as ReceiverFName, o2.LastName as ReceiverLName,
CCId, o3.FirstName as CCIdFName, o3.LastName as CCIdLName
from dbo.letterId as l
inner join dbo.OrgPerson as o1
on l.SenderId = o1.OrgPerson
inner join dbo.OrgPerson as o2
on l.ReciverId = o2.OrgPerson
inner join dbo.OrgPerson as o3
on l.CCId = o3.OrgPerson;


موفق باشید./

اگه این چیزایی که من در مورد کلید خارجی میدونم درست باشه یه سری محدیودیت توی حذف و درج و این چیزا برای من ایجاد میشه . راه دیگه ای نداره ؟ حتما باید از کلید خارجی استفاده کنم ؟؟

starting
جمعه 11 بهمن 1392, 17:25 عصر
لزوما اینگونه نیست که حتما باید کلید خارجی تعریف کنید.
کلید خارجی تعریف میکنن که عدم درج داده های غیر صحیح تضمین بشه همین.
ضمنا کلید خارجی روی کارایی پایگاه داده هم تاثیر سوء خواهد گذاشت چون این ضمانت هزینه داره. البته این به این معنا نیست که کلا قید آن را بزنیم.

اگر الان این سه فیلد را به جدول اشخاص متصل کنید (منظور کلیدخارجی) مشکلاتی خواهید داشت مثل Multiple Cascade Path.

silver2000
جمعه 11 بهمن 1392, 20:06 عصر
لزوما اینگونه نیست که حتما باید کلید خارجی تعریف کنید.
کلید خارجی تعریف میکنن که عدم درج داده های غیر صحیح تضمین بشه همین.
ضمنا کلید خارجی روی کارایی پایگاه داده هم تاثیر سوء خواهد گذاشت چون این ضمانت هزینه داره. البته این به این معنا نیست که کلا قید آن را بزنیم.

اگر الان این سه فیلد را به جدول اشخاص متصل کنید (منظور کلیدخارجی) مشکلاتی خواهید داشت مثل Multiple Cascade Path.
من نمیتونم جدوا اشخاص رو تغییر بدم چون توی پروژه های دیگه استفاده شده و اجازه ی تغییر اون رو ندارم :لبخند:

espootin
جمعه 11 بهمن 1392, 20:07 عصر
دوستمون کاملا صحیح می فرمایند.

اما توصیه من به شما این هست که حتما از کلید خارجی استفاده کنید چرا که مانع از بین رفتن یکپارچگی در دیتابیس شما خواهد شد و از آنجا که دیتابیس شما بزرگ نیست تاثیر منفی از بکار بردن کلید خارجی نخواهید داشت.

silver2000
شنبه 12 بهمن 1392, 09:46 صبح
دوستمون کاملا صحیح می فرمایند.

اما توصیه من به شما این هست که حتما از کلید خارجی استفاده کنید چرا که مانع از بین رفتن یکپارچگی در دیتابیس شما خواهد شد و از آنجا که دیتابیس شما بزرگ نیست تاثیر منفی از بکار بردن کلید خارجی نخواهید داشت.
اما دیتابیس کوچیک نیست من فقط قسمتاییشو که به سوالم مربوط میشد گفتم :گریه:

silver2000
شنبه 12 بهمن 1392, 19:49 عصر
شاید راهی که به ذهنم رسید خیلی اصولی نباشه اما گفتم بگم تا برای اینکه اگه دیگران هم مشکل من رو داشتند شاید به دردشون بخوره . توی Sp دوبار از جدول Select گرفتم و توی جداول موقت ریختم بعد جداول موقت رو با هم Full Outer join کردم و چیزی که میخواستم بدست اومد :لبخند:

espootin
شنبه 12 بهمن 1392, 20:53 عصر
توی هیچ مرجعی گفته نشده که از کلید خارجی استفاده نکنید چرا که باعث افت کارایی و سرعت میشه!!!
از نظر من هیچ مشکلی برای استفاده شما از کلیذ خارجی نیست! هر چند که دیتابیستون بزرگ باشه!
در ضمن کلید خارجی محدودیتی برای شما بوجود نمیاره!

و اما این روش، در حالی که با یک join‌ ساده جواب مورد نظر بدست می آید، اصلا منطقی نیست که شما از این روش استفاده کنی ، چرا که یک select بیشتر و همچنین تعدادی درج در جدول موقت داری! که این خودش باعث کاهش کارایی و سرعت میشه!

silver2000
دوشنبه 14 بهمن 1392, 20:40 عصر
توی هیچ مرجعی گفته نشده که از کلید خارجی استفاده نکنید چرا که باعث افت کارایی و سرعت میشه!!!
از نظر من هیچ مشکلی برای استفاده شما از کلیذ خارجی نیست! هر چند که دیتابیستون بزرگ باشه!
در ضمن کلید خارجی محدودیتی برای شما بوجود نمیاره!

و اما این روش، در حالی که با یک join‌ ساده جواب مورد نظر بدست می آید، اصلا منطقی نیست که شما از این روش استفاده کنی ، چرا که یک select بیشتر و همچنین تعدادی درج در جدول موقت داری! که این خودش باعث کاهش کارایی و سرعت میشه!
دوست عزیز من توی کار با کلید خارجی مشکل دارم و درست نمیتونم ازش استفاده کنم .ببینید این حرف من درسته ؟ مگه زمانی که میخایم کلید خارجی استفاده کنیم نباید ساختار جدولا رو تغییر بدیم ؟ اگه اینطوره من نمیتونم همچین کاری رو انجام بدم چون طراحی ابتدایی جدول OgPerson با من نبوده و من نمیتونم این جدول رو تغییر بدم اما جدول Letter رو میتونم .اگه بازم وقت بذارید و جوابمو بدید ممنون میشم