PDA

View Full Version : حذف مقادير تكراري از جدول



hodaeian
یک شنبه 14 فروردین 1390, 11:32 صبح
با سلام
من خيلي مبتدي هستم لطفا راهنماييم كنيد
من يه جدول ايجاد كرده ام و يكسري ايميل داخل جدول وارد كرده ام حالا مي خوام هنگام گزارش گيري از جدول مقادير تكراري در table حذف شود و بعد گزارش نمايش داده شود لطفا اگه ممكنه كامل توضيح دهيد چكار بايد بكنم؟
ممنون

michkadol
یک شنبه 14 فروردین 1390, 12:13 عصر
یک کوئری از نوع Find Duplicates Query Wizard ایجاد کن
کلیه فیلدهای تکراری رو نمایش میده

hodaeian
یک شنبه 14 فروردین 1390, 14:49 عصر
ممنون از راهنماييتون مقادير تكراري را نمايش ميده ولي حالا چطوري مي تونم يكي از اين مقادير را در جدولم نگه دارم و بقيه آنها را حذف كنم مثلا اگه سه تا ايمل تكراري در ليست هست يكي را نگه داره و 2 تا ي ديگه را از جدول حذف كنه

mehdi_fiz
یک شنبه 14 فروردین 1390, 21:56 عصر
سلام دوست عزیز
خوب نوع همون Query رو به delete Query تغییر بده
موفق باشید

karmand
دوشنبه 15 فروردین 1390, 07:37 صبح
جدول جديدي با ساختار اولي بساز فيلدي كه ميخواهي تكراري نباشد را كليد كن جدول اولي را در جدول دومي كپي كن
صد بار اين سئوال مطرح شده

reza850101
یک شنبه 24 اردیبهشت 1391, 15:22 عصر
باسلام خدمت دوستان من اين تايپيك را بعلت مشكلي كه دارم مجددا فعال ميكنم من يك جدولي دارم كه شامل فيلد كد ملي و فيلدتاريخ كه فرمتش تكس است ميباشد براي هر كد ملي يكسري تاريخ تكراري دارم درصورتي كه من براي هر فرد يك تاريخ ميخواهم مضاف براينكه اين تاريخ ممكن است براي فرد ديگري هم باشد - من مراحل بالا را عمل كردم و تاريخ را Yes (No Duplicates) كردم مشكل اينه كه سراسر جدول ازهرتاريخ يكي وارد شده =(درحالي كه براي هر فرد بايد تاريخ تكرار نشده باشد)
ممنون ميشم راهنمايي كنيد

RESMAILY
یک شنبه 24 اردیبهشت 1391, 20:59 عصر
به نام خدا
با سلام.اين سوال نسبتا مهمي است. بنده كه تا حال نتوانستم باصطلاح يكضرب! ركورد تكراري را حذف نمايم. همانطور كه دوستان اشاره كردند ابتدا بايد ركورد مورد نياز را جايي ذخيره كرد بعد كل ركوردهاي تكراري را به يك والذارياتي (!) پاك كرد. چون با آن «كويري دپليكيت» و فلان، نمي شود پاكشان كرد. خلاصه در ضرب سوم مجددا ركوردها را وارد جدول اصلي نمود!؟
البته بستگي به جدول ش هم دارد. اگر خوب طراحي شده باشد گاهي دو ضرب هم مي شود ركورد تكراري را پاك نمود.
شايد راه حل بهتر نوشتن يك ماجول باشد.

abdoreza57
یک شنبه 24 اردیبهشت 1391, 23:41 عصر
سلام دوست عزیز با کوئری زیر رکوردهای تکراری و غیر تکراری را میتونی به دست بیاری بعد همون را به یک جدول دیگه انتقال بده فکر میکنم راه خوبی باشه In (SELECT [melli] FROM [asli] As Tmp GROUP BY [melli] HAVING Count(*)>0 )

reza850101
دوشنبه 25 اردیبهشت 1391, 07:41 صبح
سلام دوست عزیز با کوئری زیر رکوردهای تکراری و غیر تکراری را میتونی به دست بیاری بعد همون را به یک جدول دیگه انتقال بده فکر میکنم راه خوبی باشه In (SELECT [melli] FROM [asli] As Tmp GROUP BY [melli] HAVING Count(*)>0 )

باسلام مجدد من مشكلي در مشخص كردن ركوردهاي تكراري و غير تكراري ندارم چون از طريق دو نوع كوئري آخري در ليست كوئريهاي ارائه شده توسط اكسس ميتوان بدست آورد مشكل اينه كه براي هر كدملي چند ركورد تاريخ تكراري دارم (هركدملي معرف يكنفر است ) اين درهرحالي است كه هرفرد ميتونه مثلا 90/1/1 را داشته باشه ولي هرفرد نبايددوتا90/1/1 داشته باشد = طبق پيشنهاد اين دوستمان

******جدول جديدي با ساختار اولي بساز فيلدي كه ميخواهي تكراري نباشد را كليد كن جدول اولي را در جدول دومي كپي كن
صد بار اين سئوال مطرح شده ****
من وقتي اينكار را ميكنم در جدول فقط يك 90/1/1 ميپذيرد درحالي كه هرفرد ميتونه يكباراين تاريخ را داشته باشد

crazy coder
دوشنبه 25 اردیبهشت 1391, 08:47 صبح
سلام
تا جایی که من متوجه شدم شدم میخای اگه تکراری رو دوتا ستون (کد ملی و تاریخ) رو حذف کنی...
خب کد زیر اینکار رو برات انجام میده...



SELECT col1,col2,count(*) as nuberOfDuplicate
FROM tblName
GROUP BY col1,col2
HAVING COUNT(*) > 1



خوب این کد تکراری ها رو برات میاره و تعدادشون رو هم نمایش میده...
میمونه حذف کردنش که با کد زیر انجام میشه:


delete from tblName where __ID__ not in(
SELECT MAx(__ID__) as MaxID
FROM tblName
GROUP BY col1,col2
HAVING COUNT(*) > 1



چند تا نکته:
- این کد رو sqlserver 2008 اجرا شده....اگه جایش رو اکسس قبول نکرد معادلش رو خودت پیدا کن...
- حواست باشه که اول یه بک از رو دیتابیست بگیر بعد کد من رو امتحان کن....
کدزیبایی بود....نه....
خدا رو شکر

reza850101
دوشنبه 25 اردیبهشت 1391, 14:32 عصر
توضيح ما داريم
فيلدكد ----- فيلدتاريخ
1----------------90/01/01
1-----------------90/01/01
1-----------------90/01/05
2-----------------90/01/01
2-----------------90/01/01
2-----------------90/01/02
تكراري حذف شود بشود
1-----------------90/01/01
1-----------------90/01/05
2-----------------90/01/01
2-----------------90/01/02 ببخشيد اگر توضيحات ناقص بوده

crazy coder
سه شنبه 26 اردیبهشت 1391, 08:08 صبح
سلام
عزیز پاسخ همون بود که خدمت شما عرض شد....
کدی که نوشتم رو عمل کن تا نتیجه بگیری...

reza850101
چهارشنبه 27 اردیبهشت 1391, 08:58 صبح
SELECT Max(Table11.codmal) AS MaxOfcodmal, Table11.date, Table11.ID, Table11.nomor, Table11.sal, Table11.mh, Table11.roz, Table11.ddaate
FROM Table11
GROUP BY Table11.date, Table11.ID, Table11.nomor, Table11.sal, Table11.mh, Table11.roz, Table11.ddaate
HAVING (((Max(Table11.codmal)) In (SELECT [codmal] FROM [Table11] As Tmp GROUP BY [codmal],[date] HAVING Count(*)>1 And [date] = [Table11].[date])))
ORDER BY Max(Table11.codmal), Table11.date;
كد معادل در كوئري دلت خود اكسس چنين است
واما مشكل همچنان باقيست
كوئري به مكس هم توجه نمي كنه وكليه ركوردها را پاك ميكنه ممنون ميشم دوستان راهنمايي كنن

crazy coder
چهارشنبه 27 اردیبهشت 1391, 09:17 صبح
سلام
عزیز دل...شما اومده و رو چند تا فیلد دیگه هم GROUP گذاشتی ....دقت کن به کد من...فقط و فقط همون دوتا ستون کد ملی و تاریخ باید تو GROUP باشن...باز هم یه اشتباه دیگه HAVING رو به همون ترتیبی که من نوشتم بنویس..یعنی رو همون دوتا ستون سال و کدملی.
با این کد شما معلومه همه رو پاک میکنه... این کد پایین رو اجرا کن...فقط بجای __ID__ کلید اصلی جدول خودت رو بذار



delete from Table11 where __ID__ not in(
SELECT MAx(__ID__) as MaxID
FROM Table11
GROUP BY codmal,[date]
HAVING COUNT(*) > 1

reza850101
دوشنبه 01 خرداد 1391, 13:36 عصر
[QUOTE=crazy coder;1506615]سلام
عزیز دل...شما اومده و رو چند تا فیلد دیگه هم GROUP گذاشتی ....دقت کن به کد من...فقط و فقط همون دوتا ستون کد ملی و تاریخ باید تو GROUP باشن...باز هم یه اشتباه دیگه HAVING رو به همون ترتیبی که من نوشتم بنویس..یعنی رو همون دوتا ستون سال و کدملی.
با این کد شما معلومه همه رو پاک میکنه... این کد پایین رو اجرا کن...فقط بجای __ID__ کلید اصلی جدول خودت رو بذار
باسلام .ببخشيد فرصت براي ديدن سايت دست نداد- درخصوص مطلب بالا اگردو فيلد را انتخاب كنم و تمام فيلدها را در نظر نگيرم ،چطوري همه را با كوئري اپنت به تيبل جديد منتقل كنم؟

crazy coder
سه شنبه 02 خرداد 1391, 08:12 صبح
سلام
مهندس...شما مشکل اولتون حل شد؟ اگه حل شد بعد برو سر مشکل بعدی....
ببین من به شما ماهیگیری آموزش دادم.... خود شما باید بتونی کدش رو بنویسی.... من هم برای شما select رو نوشتم ، یعنی چطوری بتونی داده های تکراری رو بدست بیاری، هم براتون delete رو نوشتم یعنی چطور بتونی داده های تکراری رو پاک کنی....
حالا شما باید بتونی همون select رو بنویسی... و نتیجه رو insert کنی....

reza850101
سه شنبه 02 خرداد 1391, 09:01 صبح
[QUOTE=crazy coder;1510670]سلام
مهندس...شما مشکل اولتون حل شد؟ اگه حل شد بعد برو سر مشکل بعدی....
د نشدديگه. مشكل همچنان باقيست. شما زحمت كشيديدبا كد موارد تكراري را پيدا كرديد درست! من اينو از طريق كوئري اكسس بدست آوردم و مكس كردن دو ستون آنرا محدود كرديد كه با كوئري انجام دادم (درنمونه ارسالي موجود است) حالا مشكل:
من اين كوئري دو ستون دارد بكارم نمياد بايد تمام فيلدها باشه وقتي بيش از دوفيلد را مكس ميكنم بهم ميريزد و شما توضيح داديد
عزیز دل...شما اومده و رو چند تا فیلد دیگه هم GROUP گذاشتی ....دقت کن به کد من...فقط و فقط همون دوتا ستون کد ملی و تاریخ باید تو GROUP باشن...ب
بهرحال موضوع تغيير نكرده ازابتدا قصد من حذف ركوردهاي( تاريخ)تكراري براي هرشخص بوده و سپس انتقال آن به تيبل 1
اگر به كوئريهاي ضميمه نگاهي بكنيد متوجه ميشود راهي كه شما ارائه داديد انجام شده (پيداكردن ركوردتكراري) اما براي حذف وانتفال موفق نبودم ممنون ميشم راهكار ارائه دهيد

crazy coder
چهارشنبه 03 خرداد 1391, 08:36 صبح
سلام
حقیقتش دقیق متوج نشدم درخواست شما چی هست!!!!
ولی کد های زیر رو براتون میذارم....

با این کد میتونی تکراری ها روی سه فیلد رو بدست بیاری...راهکار همون مطلب گذشته هست...شما میتونی تکراری رو 1000 فیلد هم بدست بیاری ، فقط باید تو Group by و select نام فیلهات رو قرار بدی... شما max رو رو کد ملی گذاشتی، باید رو ID بذاری مهندس.....


SELECT Max(Table11.ID) AS ID, Table11.date,Table11.codmal, Table11.nomor
FROM Table11
GROUP BY Table11.date,Table11.codmal, Table11.nomor;


حالا اگه شما میخای delete کنی یا این مقادیر select شده رو به یک جدول دیگه اضافه کنی باید یکم رو کدش کار کنی.... مثلا من نمیدونم که تو اکسس exists وجود داره یا not in یا شکل کاربردشون چی هست...این رو دیگه خودت باید بری پیدا کنی...
این کد رو ببین:


SELECT Table11.date, Table11.codmal, Table11.nomor, Table11.sal, Table11.mh, Table11.roz, Table11.ddaate
FROM Table11
GROUP BY Table11.date, Table11.codmal, Table11.nomor;




این کد خطا داره میدونی چرا!!!! چون sal رو نمیتونه براش group by انجام بده و یا اینکه جمعش کنه... وقتی این کد اجرا نشه ، شما طبیعتا نمیتونی insert رو اجرا کنی یعنی به سادگی اجرا کنی....یکم ریزه کاری داره که الان زمانش رو ندارم...شرمنده...
درپناه خدا

ehsan_y
پنج شنبه 04 خرداد 1391, 11:48 صبح
سلام
من زیاد حرفه ای نیستم ولی خودم معمولا برای اینجور کارا از رکوردست استفاده میکنم.

یعنی میام یکی یکی رکوردها رو مقایسه می کنم و ....

نمی دونم متوجه منظورم شدید یانه ؟
مثلا جدول رو باز کنید رکورد اولی را انتخاب کنید بعد این رکورد رو با بقیه مقایسه کنید . اگه این کورد با رکورد مورد نظر شما برابر بود و سایر شرایط رو هم داشت حذفش کنه و ...