PDA

View Full Version : مشکل در استفاده از distinct



cache_overflow
دوشنبه 22 مهر 1387, 17:16 عصر
دوستان،
من بعد از استفاده از دستور

select distinct col1 from hometbl where col2="test" order by col3

پیغام خطای زیر را میگیرم
ORDER BY items must appear in the select list if SELECT DISTINCT is specified

آیا می توانید راهنمایی کنید که من چگونه برا اساس col3 خروجی را مرتب کنم؟
و یا همانطور که می دانید خروجی distinct مرتب شده بر اساس نام ستونی است که جلوی آن نوشته شده . آیا می شود این مرتب سازی را غیر فعال کرد؟

AminSobati
دوشنبه 22 مهر 1387, 23:41 عصر
دوست عزیزم،
طبق استاندارد زبان SQL، در صورتیکه که از Distinct استفاده میکنید، فقط Order By روی فیلدهایی مجازه که در Select (جلوی Distinct) حضور دارند. البته صرف نظر از این استاندارد، اگر در مورد خروجی دستور هم فکر کنید متوجه میشین که منطقیش همینه

رضا جاسبی
دوشنبه 22 مهر 1387, 23:56 عصر
خوب این منطقیه که وقتی شما ستونی رو انتخاب نمی کنید و مهمتر از اون اینکه براتون اهمیت نداره (به دلیل اینکه distinct روی یک ستون دیگه میذارید) رو نمی تونه به عنوان پارامتر سورت قبول کنه. مثال : فرض کن دو تا سطر داشته باشی هردو Col2 برابر test باشه و در شرط صدق کنه در هر دو هم col1 برابر مثلا 1 باشه اما col3 یکی 1 و دیگری 3 باشه. در حالتی کهdistinct میذاری این دو تا یک سطر میشن. حالا فرض کن یک سطر دیگه هم باشه که col1 و col3 برابر 2 باشن. حالا این سطر باید قبل از سطر col1 برابر 1 باشه (بخاطر اون سطر col3=3) یا بعد از اون (col3=1). جوابش رو فکر انسان هم نمیتونه بده چه برسه به کامپیوتر.
اگر می خواهی بر اساس col3 مرتب کنی یا باید بدون distinct باشی و یا col3 در لیست select باشه.

cache_overflow
سه شنبه 23 مهر 1387, 09:45 صبح
خیلی ممنون از راهنماییتون،
یکی از خاصیتهای distinct اینه که خروجی را مرتب می کنه .آیا راهی وجود داره که این مرتب سازی غیرفعال بشه؟

cache_overflow
سه شنبه 23 مهر 1387, 12:58 عصر
دوستان،
آبا هیچ راهی برای شبیه سازی کوئری زیر وجو ندارده مثلا select متداخل و یا...

select distinct col1 from hometbl where col2="test" order by col3

رضا جاسبی
چهارشنبه 24 مهر 1387, 23:44 عصر
خیلی ممنون از راهنماییتون،
یکی از خاصیتهای distinct اینه که خروجی را مرتب می کنه .آیا راهی وجود داره که این مرتب سازی غیرفعال بشه؟

distinct خروجی رو مرتب نمیکنه. بلکه اون رو فیلتر یا به عبارت بهتر تمیز می کنه و مقادیر تکراری رو حذف می کنه.



دوستان،
آبا هیچ راهی برای شبیه سازی کوئری زیر وجو ندارده مثلا select متداخل و یا...


select distinct col1 from hometbl where col2="test" order by col3



همانطور که گفتم این دستور از نظر منطقی ایراد داره. مثالی که زدم رو دقت کن و ببین که آیا خودت به جای کامپیوتر می تونی نتیجه مشخص و قطعی بدی؟
col1 col2 col3
1 Test 1
1 Test 3
2 Test 2

و نتیجه Select شما با Distinct میشه
Col1
1
2
چطور بر اساس Col3 مرتب می کنی؟ آیا مقدار 1 در col1 که در نتیجه اومده باید قبل از مقدار 2 بیاد (به خاطر col3=1 در سطر اول) و یا بعد از اون (به خاطر Col3=3 در سطر دوم)؟؟
اگر منظور اصلی و به عبارت دیگه صورت مساله رو بگی شاید بتونیم راه حل دیگه ای پیدا کنیم. اما این دستور رو فکر نمی کنم بشه کاریش کرد. فکر کن که نتیجه Select روی این جدولی که مثال زدم چی باشه بعد شاید بشه با دستورات Select به نتیجه ای رسید.

Omid Rekabsaz
پنج شنبه 25 مهر 1387, 15:24 عصر
برای همه col1 های یکسان col3 یکسان وجود دارد؟!
اگر اینطور است که می توانید col3 را در Distinct بیاورید و در غیر اینصورت درخواست غیرمنطقی است...

AminSobati
جمعه 26 مهر 1387, 15:26 عصر
فکر میکنم پستهای شماره 6 و 7 قانع کننده باشند برای طراح سوال.
فقط این نکته رو اضافه میکنم که Distinct کارش مرتب کردن اطلاعات نیست، فقط برای اینکه آیتم های تکراری راحت تر پیدا و حذف بشن، ابتدا یک Sort صورت میگیره. درست مثل Group By