سلام ;
توی یکی از جداول ،تعدادی از رکورد هامون کاملا تکراری هستند(محتویات همه فیلد هاشون برابر است) چطور میشه این موارد را شتاسایی کرد و موارد تکراری را پاک کرد
سلام ;
توی یکی از جداول ،تعدادی از رکورد هامون کاملا تکراری هستند(محتویات همه فیلد هاشون برابر است) چطور میشه این موارد را شتاسایی کرد و موارد تکراری را پاک کرد
شما می توانید با دستور distict بعد از select استفاده کنید که رکودهای تکراری را نشان نمی دهد.
https://barnamenevis.org/showpo...92&postcount=3
با روشهای متنوع و متعددی می تونید این کار را انجام بدید. مقاله ی بالا را نگاه کنید.
اگر از نسخه ی 2005 و بالاتر استفاده می کنید با تابع row_number و cte اینکار به سادگی قابل انجام است.
ببین دوست من فرض می کنیم که جدول شما یه فیلد داره که این فیلد unique هست (منحصر به فرد) و اسم اون مثلاً Name حالا شما این کد رو بنویس.
select name,count(name) from MyTable group by name having count(name)>1
این کد فیلدهای تکراری رو بهت می ده
اگه بازم مشکل داری یه بک آپ از دیتابیست بفرست تا کد کاملو بدم بهت
دوست عزیزمون msalim درست میگه پیدا کردنشون راحته با یک گروپ بای از تمام فیلد ها و یک count مشخض میشه که کدوم تکراریه اما مهم اینه که تکراری ها پاک بشه و یک نسخه از آن بماند.من به یه جاهایی رسیدم به این صورت که ابتدا یک فیلد شمارنده(id) به جدول اضافی می کنیم و فرض می کنیم جدولمون دو فیلد sname وfamily داره
deletefrom x
where id notin(selectmax(id)
from x
groupby sname,family)
چطوری id را به سطرها دادین. یعنی سطرهای تکراری را گروه بندی کردین و به هر سطر یک id از شماره 1 تا n برای n امین سطر دادین؟
اگر اینطور باشه کافیه دستور delete به شکل زیر در بیاد:
delete from x
where id > 1
ولی من دقیق متوجه ستون id که دادین نشدم ولی به نظر می رسه کوئری که پست کردین درست باشه
Edit:
کوئری که پست کردین کاملا درست است منتهی من id را با rank اشتباه گرفتم!
آخرین ویرایش به وسیله محمد سلیم آبادی : شنبه 17 بهمن 1388 در 18:39 عصر
یک نکته مهم
دستور حذف فوق کلیه اطلاعات تکراری را حذف میکند بدون اینکه اثری از یکی از انها باقی بگذارد
اگر میخواهید از رکوردهای تکراری یکی بماند
ایتدا دستور زیر را اجرا کنید
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)))
کدی که شما نوشتید تنها زمانی قابل استفاده است که حد اکثر یک نمونه داده ی تکراری داشته باشیم چون هنگامی سطر پاک میشه که 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)
کاملا درست عمل می کنند.
حق با شماست
من به اين نكته دقت نكرده بودم
آيا بدون حلقه هم ميتوان اينكار را انجام داد ؟
دو query که در پست شماره ی 9 وجود دارند بدون استفاده از حلقه عمل می کنند. لینک موجود در پست 3 همین تاپیک رو دنبال کنید.آیا بدون حلقه هم میتوان اینکار را انجام داد ؟