PDA

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



mehdi_moosavi
شنبه 06 تیر 1383, 11:51 صبح
سلام
خسته نباشید
من یک جدول دارم که چند هزار رکورد داره
ولی بعضی از رکوردهای اون تکراری هستن
چطور میتونم رکوردهای تکراری رو حذف کنم؟

Mahdavi
شنبه 06 تیر 1383, 15:31 عصر
با سلام
این سوال قبلا در همین سایت جواب داده شده.
بهر حال :
اگه لا اقل یک فیلد داری که در رکورد های مشترک فرق کنه چه بهتر . در غیر اینصورت یه فیلد از نوع Identity مثلا به نام Srl به بانکت اضافه کن.
حالا فرض کن مثلا فیلدهای بانک به نامهای name و family و ID و Srl (که خودمان اضافه کردیم) باشد:



delete Table1
from (select name,id,family
from Table1) tb1
where table1.name = tb1.name and
table1.family = tb1.family and
table1.id = tb1.id and
table1.srl < tb1.srl

mehdi_moosavi
یک شنبه 07 تیر 1383, 00:06 صبح
سلام خدمت آقای مدیر ( و بقیه دوستان )
خیلی متشکر از راهنمائیتون

reza850101
پنج شنبه 20 مهر 1385, 10:27 صبح
باسلام
من کد بالاراتست کردم به نتیجه نرسیدم ممکن است درخصوص پاسخ آقای مهدوی توضیح دهید که حتما کلیه فیلدها ی جدول باید قید شودfrom (select name,id,family
from Table1) tb1 یاخیر ؟ ضمنا دراینجا ltچه کاری انجام میدهد table1.srl < tb1.srl

reza850101
پنج شنبه 20 مهر 1385, 12:35 عصر
زحمت کشیده درستش رابنویسید ممنون

JavanSoft
پنج شنبه 20 مهر 1385, 14:50 عصر
آیا می خواهید پس از حذف حداقل یکی از رکوردها باقی بماند؟

reza850101
شنبه 22 مهر 1385, 08:04 صبح
بله همانطوری هست که شما میگویید
--------------------
بله همانطوری هست که شما میگویید

JavanSoft
شنبه 22 مهر 1385, 10:23 صبح
در این حالت برنامه فوق تمامی تکرار ها را حذف می نماید
همانگونه که دوست عزیز مهدوی قید کردند پس از ایجاد فیلد کلیدی بدون تکرار با استفاده از GroupBy رکورد هایی با ارزش پایین تر از حداکثر گروه را حذف کنید در این حالت فقط یک رکورد باقی می ماند

حمیدرضاصادقیان
شنبه 22 مهر 1385, 12:50 عصر
http://support.microsoft.com/kb/q139444/

taheri-ali
شنبه 22 مهر 1385, 21:36 عصر
select filedname,count(fieldname) from tablename group by fieldname
having count(fieldname)>1

reza850101
چهارشنبه 26 مهر 1385, 13:23 عصر
ببخشید من مبتدیم لذا این کد را درقسمت کوئری تیبلم ساختم و در کوئری آنالیزر ران کردم اما بجای رکورد محتوایات فیلدها حذف شد ممکنه درستشو بنویسید
SELECT COUNT(*) AS Expr4, C_PersonCode AS Expr1, CommandNo AS Expr2, StartDate AS Expr3
FROM PersonnelDossier
GROUP BY C_PersonCode, CommandNo, StartDate
HAVING (COUNT(*) > 1) DELETE personneldossier
FROM (SELECT C_PersonCode, CommandNo, StartDate
FROM personneldossier) tb
WHERE personneldossier.C_PersonCode = personneldossier.C_PersonCode AND personneldossier.CommandNo = personneldossier.CommandNo AND
personneldossier.StartDate = personneldossier.StartDate

reza850101
شنبه 29 مهر 1385, 13:33 عصر
سلام
حداقل یه گوشه چشمی به این کد بیاندازید که دراس کیو سرور نوشتم اما بجای حذف رکورد تکراری همه راحذف کرد اگه زحمت نیست اصلاح بفرمایید
DELETE PersonnelDossier
SELECT COUNT(*) AS Expr5, C_PersonCode AS Expr1, CommandNo AS Expr2, StartDate AS Expr3, EndDate AS Expr4
FROM PersonnelDossier
GROUP BY C_PersonCode, CommandNo, StartDate, EndDate
HAVING (COUNT(*) > 1)

reza850101
جمعه 05 آبان 1385, 16:28 عصر
ابنچا کسی نیست ؟

scorpion13g
جمعه 05 آبان 1385, 19:43 عصر
این که کاری نداره
از اولین رکورد شروع کن ببین تا آخر شبیه اون هست یا نه اگه بود پاکش کن و بعد برو سراغ رکورد دوم به همین ترتیب تا آخرین رکورد.

reza850101
شنبه 06 آبان 1385, 14:42 عصر
خدا خیرت بده این که گفتی مثل آّب خوردنه اما یه 24ساعت طول میکشه هزارتارکوردتکراری راحذف کرد
مردمومن راه کارارائه بده ! باکدمیخوام اینکاربشه وفقط تکراری ها وگرنه کدبالا همه رایه جا پاک کرد .

arshia_
یک شنبه 07 آبان 1385, 08:56 صبح
من یه روش پیشنهاد می کنم
درسته زیاد حرفه ای نیست ولی راحتتر از روشهای دیگه است
یه فرمان select distinct * from tblname
حالا مقادیری رو که این کوئری برمی گردونه توی یه جدول با مشخصات مشابه جدول مقصد insert کن
حالا جدول اول رو پاک کن و مقایدر جدول دوم رو جایگزینش کن

JavanSoft
دوشنبه 08 آبان 1385, 09:36 صبح
فرض این است که فیلد NameID کلید جدول و یکتاست. اگر چنین فیلدی در جدول نبود می‌توان آنرا ایجاد کرد.(فیلدی از نوع int و Identity )
در قطعه کد زیر ابتدا جدول را از اطلاعات فرضی پر کرده و سپس با یک دستور Delete رکوردهای تکراری آنرا حذف می‌کنیم..


Craete Table Dups (NameID int,FirstName varchar(10),LastName varchar(10))
Go
Insert into Dups values (106, ‘Robert’, ‘Aide’)
Insert into Dups values (107, ‘David’, ‘Koidl’)
Insert into Dups values (108, ‘Hongbo’, ‘Li’)
Insert into Dups values (123, ‘Robert’, ‘Aide’)
Insert into Dups values (124, ‘David’, ‘Koidl’)
Insert into Dups values (125, ‘Hongbo’, ‘Li’)
Insert into Dups values (138, ‘Robert’, ‘Aide’)
Insert into Dups values (139, ‘David’, ‘Koidl’)
Insert into Dups values (140, ‘Hongbo’, ‘Li’)
Insert into Dups values (153, ‘Robert’, ‘Aide’)
Insert into Dups values (154, ‘David’, ‘Koidl’)
Insert into Dups values (155, ‘Hongbo’, ‘Li’)
Go
Delete From Dups
Where
Exists(
Select NameId
From Dups DupsInner
Where DupsInner.FirstName = Dups.FirstName
And DupsInner.LastName = Dups.LastName
And DupsInnet.NameID<Dups.NameId )

reza850101
چهارشنبه 10 آبان 1385, 11:38 صبح
باسلام جناب جوان من واردنیستم dups که تیبل است اما existsو dupsinner
چیه و چکارمیکنه

venus_zohreh
چهارشنبه 10 آبان 1385, 11:56 صبح
فیلدی را که در کلاز select انتخاب کردید را باید به صورت زیر تغییر دهید:

(SELECT DISTINCT(your field
با این کار موارد تکراری حذف خواهد شد

reza850101
پنج شنبه 11 آبان 1385, 08:27 صبح
متاسفانه من بافرامین بالا به نتیجه نرسیدم اما طبق جوابیه زیر عمل کردم به نتیجه رسیدم
یک کواری از نوع make بسازید groupbyرا فعال کنید و فیلد هایی که میخواهید فقط یکی شود را group کنید بقیه را firstانتخاب کنید

اما مشکل اینه که درتیبل قبلی فیلد کلید وجودداشته که در تیبل جدید نمیتوان آن را ایجاد کرد چطورمیشه این مشکل را حل کرد
ضمنا سوال بالا هنوز بقوت خود باقیست درمورد existsو dupsinner

reza850101
چهارشنبه 17 آبان 1385, 14:19 عصر
بعید میدونم کسی جواب سوالم بلدنباشه یااینکه سوال بی ارزشه؟