PDA

View Full Version : DISTINCT



net_ved
یک شنبه 19 مهر 1388, 11:48 صبح
سلام
با اجازه کلی می پرسم من دوتا جدولو به هم Inner join کردم ولی مثلا فقط ID یکی از جدول هام واسم مهمه پس با این کد داده هارو کم کردم.. مثلا جدول 1 جدول پرسنل و جدول دوم جدول پرداختی های حقوق پرسنل باشه .. خوب من اول این دوتا جدول رو به هم inner join کردم و بعد محدوده مورد نیازمو مشخص کردم .. مثلا گفتم اونایی که متولد سال 64 هستن که مربوط به جدول پرسنل میشه و اونایی که بالای 2000 بهشون پرداخت شده یا هر شرط دیگه ای ... خوب طبیعی که هر یک از پرسنل ممکنه تو جواب پایانی بارها تکرار بشه ... من میام با DISTINCT روی کلید پرسنل این مشکل رو حل می کنم ولی مشکل دیگه اینه که من می خوام یه سری اطلاعات دیگه هم تو نتیجه باشه مثل نام و نام خ و ... برای این کار خودم یه ابتکار به خرج دادم ... از نظر شما درسته .. راه های دیگه ای هم هست ؟؟؟


SELECT *
FROM (SELECT DISTINCT Personel.Pcode
FROM Personel INNER JOIN
Pardakhtha ON Personel.PCode = Pardakhtha.Pcode) t1 INNER JOIN
Personel ON Personel.PCode = t1.Pcode

آریوس1985
یک شنبه 19 مهر 1388, 12:24 عصر
شما ظاهرا یک مقدار قضیه رو پیچیده کردی
لزومی نداره از 2 تا SELECT تو در تو استفاده کنید ( اگرچه شاید اینجا خیلی تاثیری تو سرعت نداشته باشه )
شما بقیه فیلدهاتون رو هم مثل همون یک فیلدی که صدا کردی می تونید صدا بزنید

SELECT DISTINCT Personel.Pcode,Personel.Name,Personel.Tel,Pardakht ha.Date,Pardakhtha
FROM Personel INNER JOIN
Pardakhtha ON Personel.PCode = Pardakhtha.Pcode) t1 INNER JOIN
Personel ON Personel.PCode = t1.Pcode

محمد سلیم آبادی
سه شنبه 21 مهر 1388, 04:05 صبح
سلام،
روشی که شما استفاده می کنین (استفاده از table expressions) روش استانداردی است. بهتر است همیشه Query ها را به گونه ای تایپ کنین که در حد اکثر خوانایی قرار بگیرن



/*
SELECT *
FROM
(
SELECT DISTINCT Personel.Pcode
FROM Personel
INNER JOIN Pardakhtha
ON Personel.PCode = Pardakhtha.Pcode
) t1
INNER JOIN Personel
ON Personel.PCode = t1.Pcode
*/


البته بسته به نوع پرس و جویی که می خواهین بسازین Query های متعددی می توان ایجاد کرد.

بستگی دارد که چگونه به SQL نگاه می کنین. آیا Set-Oriented فکر می کنین.

net_ved
سه شنبه 21 مهر 1388, 09:52 صبح
از بین (row-based و row-oriented و set-based ) فکر کنم set-based بهتر باشه چون (SQL is a ُSet-based, declarative query language, not an imperative lanquage such as C or Pascal) خوب البته فقط در همین حد می دونم .. چطوری می تونم همیشه سریع ترین کد رو تشخیص بدم ... set-based بودن رو چطوری یاد بگیرم ؟

(http://en.wikipedia.org/wiki/Declarative_programming)
(http://en.wikipedia.org/wiki/Imperative_programming)

محمد سلیم آبادی
سه شنبه 21 مهر 1388, 11:46 صبح
بر اساس مطالعات نه چندان زیادم در این زمینه به این نکته رسیدم که همیشه Query های بر پایه ی مجموعه سرعت و عملکرد خوبی ندارند! بلکه گاهی اوقات راه حل های Procedural گزینه ی بهتری هستند.

همانطوری که در نرم افزار ما مفهوم Object-Oriented (شی گرا) را داریم در بحث مربوط به پایگاه داده ها ما از مفهوم Set-Oriented (مجموعه گرا) استفاده می کنیم. یعنی شما باید به جداول و داده هایتان به عنوان مجموعه (Set) نگاه کنین و از عملگر های مجموعه ای مثل اشتراک، اجتماع، تفاضل و ضرب دکارتی در برنامه هایتان استفاده.

کتاب های سری Inside Microsoft SQL Server به مباحث مربوط به Query و Programming به شکل کاملا پیشرفته و حرفه ای و اساسی پرداخته است. اگر این کتب را مطالعه کنین (البته من شروع به مطالعه ی این کتب کردم) دید کاملا وسیع تر و متفاوت از الانتان خواهید داشت!

برای اینکه با یک گوشه ای از نظریه مجموعه ها (Set Theory) و جبر رابطه ای (Relational Algebra) آشنا شوین برخی از پست های وبلاگم را بخوانین.

Kamyar.Kimiyabeigi
سه شنبه 21 مهر 1388, 13:18 عصر
distinct خيلي كند ميكنه سعي كن اطلاعات تكراري رو با group by تصحيح كني