PDA

View Full Version : سوال: سوال در مورد Distinct



mpmsoft
پنج شنبه 13 آبان 1389, 10:23 صبح
دوستان من یک جدول دارم که سه ستون نام،نام خانوادگی،ID دارم

حالا می می خوام ID رکوردهایی که از Distinct بدست میارم رو بدست بیارم



Select Distinct([نام] + ' ' + [نام خانوادگی]) From TblName

تا اینجا مشکلی نیست. حالا من می خوام ID این رکوردهارو هم بهم بده وقتی بعد از Distinct فیلد ID رو هم اضافه می کنم کل رکوردهارو بر می گردونه




Select Distinct([نام] + ' ' + [نام خانوادگی]),ID From TblName

حمیدرضاصادقیان
پنج شنبه 13 آبان 1389, 10:54 صبح
سلام.مشکل اینجاست که شما دارید ترکیب دو فیلد نام و نام خانوادگی رو Distinct میگیرید ولی برای هرکدوم یک id جداگانه داره. به خاطر همینه وقتی id رو میذارید کل رکوردها رو به شما میده.
الان اگر بخواهید id یک رکورد رو بگیرید کدوم id رو باید به شما بده؟؟ ممکنه مثلا یک اسم با چندتا id مختلف باشه شما کدومش رو میخوای.؟

mpmsoft
پنج شنبه 13 آبان 1389, 11:00 صبح
حمید جان سادست شما فکر کن یک جدول دفترچه تلفن داری
حالا اسم حسن رضایی 10 بار ثبت شده
حالا من می خوام تمام رکوردهای غیر تکراری رو بدست بیارم

حالا وقتی می زنم Distinct کلا یک ستون بهم می ده و اسم اشخصاص رو برمی گردونه و تا اینجا هیچ مشکلی نیست

حالا من می خوام دوتا ستون بهم بده یکی اسم شخص و دیگری ID اون توی تیبل

ID همون Autonumber هست

حمیدرضاصادقیان
پنج شنبه 13 آبان 1389, 11:25 صبح
سلام.


With Cte as
(select ID,(fnam+' '+lname) as Name from table1)
select MIN(id),name from cte
group by name

حمیدرضاصادقیان
پنج شنبه 13 آبان 1389, 11:34 صبح
مدیر محترم
مشکلی که در دستور distinct وجود داره همینه که هر فیلدی که جلو این دستور قرار میگیره به صورت ترکیبی در نظر گرفته میشود و شما نمیتونید بگید فقط نام و نام خانوادگی رو distinct کن

سلام.دوست عزیز مطلب رو کامل مطالعه بفرمائید


حالا اسم حسن رضایی 10 بار ثبت شده
حالا من می خوام تمام رکوردهای غیر تکراری رو بدست بیارم

حالا وقتی می زنم Distinct کلا یک ستون بهم می ده و اسم اشخصاص رو برمی گردونه و تا اینجا هیچ مشکلی نیست

حالا من می خوام دوتا ستون بهم بده یکی اسم شخص و دیگری ID اون توی تیبل

ID همون Autonumber هست

ایشون هم خودشون به این موضوع واقف هستند ولی توضیح دادند که شرایط جدولشون به چه شکلی هست که با کدی که من نوشتم مشکلشون حل میشه.

m_omrani
جمعه 14 آبان 1389, 00:22 صبح
خدا خیرت بده آقای صادقیان. اتفاقاً بر عکس.
چیزی که پرس و جوی شما برای اسامی تکراری داره می ده، ID اولین رکورد از مجموعه رکوردهای دارای اسم یکسانه.

مساله اینجا است که مشکل در سوالیه که مطرح شده.

وقتی چیزی چند بار تکرار می شه دیگه به دست آوردن فقط یه ID برای اون معنی نمی ده. چون هر رکورد تکراری دارای یک ID جدا است. به همین دلیله که اضافه کردن ID به لیست DISTINCT هم غلطه.

به نظر من چیزی که آقای mpmsoft دنبالش هست ID رکوردهاییه که اسامی تکراری دارن و یا می تونه بالعکس باشه. ID رکوردهایی که اسامی تکراری ندارن.

به عقیده من پرس و جوی درست اینه:

به دست آوردن رکوردهایی که فقط یک بار تکرار شده اند:


select * from table1 where fname + ' ' + lname in (select fname + ' ' + lname from table1 group by fname,lname having count(*) = 1)
به دست آوردن رکوردهایی که بیش از یک بار تکرار شده اند:


select * from table1 where fname + ' ' + lname not in (select fname + ' ' + lname from table1 group by fname,lname having count(*) = 1)

حمیدرضاصادقیان
جمعه 14 آبان 1389, 20:37 عصر
خدا خیرت بده آقای صادقیان. اتفاقاً بر عکس.
چیزی که پرس و جوی شما برای اسامی تکراری داره می ده، ID اولین رکورد از مجموعه رکوردهای دارای اسم یکسانه.

مساله اینجا است که مشکل در سوالیه که مطرح شده.

وقتی چیزی چند بار تکرار می شه دیگه به دست آوردن فقط یه ID برای اون معنی نمی ده. چون هر رکورد تکراری دارای یک ID جدا است. به همین دلیله که اضافه کردن ID به لیست DISTINCT هم غلطه.

به نظر من چیزی که آقای mpmsoft دنبالش هست ID رکوردهاییه که اسامی تکراری دارن و یا می تونه بالعکس باشه. ID رکوردهایی که اسامی تکراری ندارن.

به عقیده من پرس و جوی درست اینه:

به دست آوردن رکوردهایی که فقط یک بار تکرار شده اند:


select * from table1 where fname + ' ' + lname in (select fname + ' ' + lname from table1 group by fname,lname having count(*) = 1)
به دست آوردن رکوردهایی که بیش از یک بار تکرار شده اند:


select * from table1 where fname + ' ' + lname not in (select fname + ' ' + lname from table1 group by fname,lname having count(*) = 1)


ممنون دوست عزیز. اینجا دیگه جناب mpmsoft صورت مساله رو واضح کنند . وگرنه اگر منظورشون موردی باشه که من توضیح دادم باهمون دستور کارشون راه میافته .چون من خودم همین موردی که شما فرموید رو در پست شماره 2 توضیح دادم.من این کد رو رو ییک جدول با همین ساختار تست کردم که جواب مورد نظر(اینجوری که من متوجه شدم) رو دریافت کردم. موفق باشید