PDA

View Full Version : عدم نمایش فیلدهای تکراری



negar442
چهارشنبه 04 شهریور 1394, 00:34 صبح
در دستور سلکت آیا به جز distinct راهی وجود داره که فیلدهای تکراری در خروجی نمایش داده نشه؟

SabaSabouhi
پنج شنبه 05 شهریور 1394, 09:50 صبح
در دستور سلکت آیا به جز distinct راهی وجود داره که فیلدهای تکراری در خروجی نمایش داده نشه؟

سلام
بله وجود داره، می‌تونی از Group By استفاده کنی. اما distinct به‌ترین روش هست.

صبا صبوحی

emad8159
شنبه 07 شهریور 1394, 15:55 عصر
سلام ، دوست عزیز دستور select distinct * from tablename باعث حذف رکورد های تکراری می شود و نه فیلدهای تکراری .

negar442
یک شنبه 08 شهریور 1394, 19:28 عصر
سلام ، دوست عزیز دستور select distinct * from tablename باعث حذف رکورد های تکراری می شود و نه فیلدهای تکراری .

منظور من هم رکورد بود ولی اشتباهی گفتم فیلد

حمیدرضاصادقیان
سه شنبه 10 شهریور 1394, 10:42 صبح
سلام
group by و Distinct رفتار مشابه دارند و یک Plan یکسان ایجاد میکنند و ارجحیتی نسبت به هم ندارند.
ولی در کل استفاده از Group By برای یک منظور دیگه است.

Seyyed_H_T
یک شنبه 15 شهریور 1394, 10:25 صبح
سلام
group by و Distinct رفتار مشابه دارند و یک Plan یکسان ایجاد میکنند و ارجحیتی نسبت به هم ندارند.
ولی در کل استفاده از Group By برای یک منظور دیگه است.

سلام، فقط یک مطلب در مورد ارجحیت؛ Group By بر DISTINCT ارجحیت دارد به این ترتیب که در زمان تولید نتایج ابتدا Group By فراخوانی می شود سپس برخی توابع مانند توابع ویندوزی مثل ROW_NUMBER و سپس دستور DISTINCT بر روی آخرین نتایج لحاظ می گردد.

Seyyed_H_T
یک شنبه 15 شهریور 1394, 10:35 صبح
برای عدم نمایش رکورد های تکراری علاوه بر استفاده از DISTINCT می توانید نکته ی ذیل را مد نظر داشته باشید:



چنانچه نتایج از یک جدول فراخوانی می گردند که دارای یک شناسه (Index Unique) یا کلید اصلی (Primary Key) هستند به جای استفاده از کلیه ی فیلدها فقط فیلدهای شناسه یا کلید اصلی را مد نظر بگیرید.


از جمله راه حل های موازی جهت عدم نمایش رکوردهای تکراری می توانید موارد ذیل را در نظر بگیرید:

با استفاده از نکته ی فوق و تابع ROW_NUMBER


SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY UniqueColumn1, uniqueColumn2 ORDER BY (SELECT 0)) As seq
FROM yourTable) dt
WHERE (seq = 1);



یک روش برای این منظور استفاده از UNION می باشد و البته روش استانداردی برای این منظور نیست:


SELECT TOP(1) *
FROM yourTable
UNION
SELECT *
FROM yourTable

حمیدرضاصادقیان
دوشنبه 23 شهریور 1394, 21:03 عصر
سلام، فقط یک مطلب در مورد ارجحیت؛ Group By بر DISTINCT ارجحیت دارد به این ترتیب که در زمان تولید نتایج ابتدا Group By فراخوانی می شود سپس برخی توابع مانند توابع ویندوزی مثل ROW_NUMBER و سپس دستور DISTINCT بر روی آخرین نتایج لحاظ می گردد.

بله حرف شما صحیحه. در Logical Processing عملا به این شکل رفتار میکنه. البته شاید به صورت Physical به این شکل شاید رفتار نکنه براساس استفاده از Index ها یا Statistics ها و ...