PDA

View Full Version : سوال: حذف رکورد های تکراری



hamed.rezaei
جمعه 16 بهمن 1388, 16:59 عصر
سلام ;
توی یکی از جداول ،تعدادی از رکورد هامون کاملا تکراری هستند(محتویات همه فیلد هاشون برابر است) چطور میشه این موارد را شتاسایی کرد و موارد تکراری را پاک کرد

alistajloo
جمعه 16 بهمن 1388, 17:15 عصر
شما می توانید با دستور distict بعد از select استفاده کنید که رکودهای تکراری را نشان نمی دهد.

محمد سلیم آبادی
جمعه 16 بهمن 1388, 20:19 عصر
http://barnamenevis.org/forum/showpost.php?p=806992&postcount=3

با روشهای متنوع و متعددی می تونید این کار را انجام بدید. مقاله ی بالا را نگاه کنید.

اگر از نسخه ی 2005 و بالاتر استفاده می کنید با تابع row_number و cte اینکار به سادگی قابل انجام است.

taheri-ali
شنبه 17 بهمن 1388, 11:32 صبح
ببین دوست من فرض می کنیم که جدول شما یه فیلد داره که این فیلد unique هست (منحصر به فرد) و اسم اون مثلاً Name حالا شما این کد رو بنویس.
select name,count(name) from MyTable group by name having count(name)>1
این کد فیلدهای تکراری رو بهت می ده
اگه بازم مشکل داری یه بک آپ از دیتابیست بفرست تا کد کاملو بدم بهت

محمد سلیم آبادی
شنبه 17 بهمن 1388, 11:41 صبح
ببین دوست من فرض می کنیم که جدول شما یه فیلد داره که این فیلد unique هست (منحصر به فرد) و اسم اون مثلاً Name حالا شما این کد رو بنویس.
select name,count(name) from MyTable group by name having count(name)>1
این کد فیلدهای تکراری رو بهت می ده
اگه بازم مشکل داری یه بک آپ از دیتابیست بفرست تا کد کاملو بدم بهت

سلام،
مشکل پیدا کردن داده های تکراری نیست، مساله حذف آن داده هاست.

hamed.rezaei
شنبه 17 بهمن 1388, 18:20 عصر
سلام،
مشکل پیدا کردن داده های تکراری نیست، مساله حذف آن داده هاست.




دوست عزیزمون msalim درست میگه پیدا کردنشون راحته با یک گروپ بای از تمام فیلد ها و یک count مشخض میشه که کدوم تکراریه اما مهم اینه که تکراری ها پاک بشه و یک نسخه از آن بماند.من به یه جاهایی رسیدم به این صورت که ابتدا یک فیلد شمارنده(id) به جدول اضافی می کنیم و فرض می کنیم جدولمون دو فیلد sname وfamily داره

delete from x
where id not in (select max(id)
from x
group by sname,family )

محمد سلیم آبادی
شنبه 17 بهمن 1388, 18:27 عصر
چطوری id را به سطرها دادین. یعنی سطرهای تکراری را گروه بندی کردین و به هر سطر یک id از شماره 1 تا n برای n امین سطر دادین؟

اگر اینطور باشه کافیه دستور delete به شکل زیر در بیاد:


delete from x
where id > 1

ولی من دقیق متوجه ستون id که دادین نشدم ولی به نظر می رسه کوئری که پست کردین درست باشه

Edit:
کوئری که پست کردین کاملا درست است منتهی من id را با rank اشتباه گرفتم!

JavanSoft
دوشنبه 19 بهمن 1388, 14:23 عصر
یک نکته مهم
دستور حذف فوق کلیه اطلاعات تکراری را حذف میکند بدون اینکه اثری از یکی از انها باقی بگذارد

اگر میخواهید از رکوردهای تکراری یکی بماند
ایتدا دستور زیر را اجرا کنید

Alter table X add RmvTag int Identity

سپس



Delete
FROM X
WHERE (RmvTag IN
(SELECT MAX(RmvTag)
FROM X
GROUP BY Name,Family
HAVING (COUNT(*) > 1)))

محمد سلیم آبادی
دوشنبه 19 بهمن 1388, 15:13 عصر
یک نکته مهم
دستور حذف فوق کلیه اطلاعات تکراری را حذف میکند بدون اینکه اثری از یکی از انها باقی بگذارد

اگر میخواهید از رکوردهای تکراری یکی بماند
ایتدا دستور زیر را اجرا کنید

Alter table X add RmvTag int Identity




کدی که شما نوشتید تنها زمانی قابل استفاده است که حد اکثر یک نمونه داده ی تکراری داشته باشیم چون هنگامی سطر پاک میشه که Tag آن برابر با max آن گروه باشه. پس اگر n تا رکورد تکراری از یک نمونه داشته باشیم تنها یک نمونه آن (یعنی Tag=max) حذف میشه.

ولی این کد:


delete from @t
where i not in
(select max(i) -- or MIN
from @t
group by name,family)


و این کد:


DELETE FROM @t
FROM @t t1
WHERE EXISTS
(SELECT *
FROM @t t2
where t1.name = t2.name
and t1.family = t2.family
and t1.i > t2.i)


کاملا درست عمل می کنند.

JavanSoft
دوشنبه 19 بهمن 1388, 15:48 عصر
حق با شماست
من به اين نكته دقت نكرده بودم
آيا بدون حلقه هم ميتوان اينكار را انجام داد ؟

محمد سلیم آبادی
دوشنبه 19 بهمن 1388, 15:58 عصر
آیا بدون حلقه هم میتوان اینکار را انجام داد ؟
دو query که در پست شماره ی 9 وجود دارند بدون استفاده از حلقه عمل می کنند. لینک موجود در پست 3 همین تاپیک رو دنبال کنید.