سؤال

لدي Access 2003 الجدول مع ~4000 السجلات التي تم إجراؤها من 17 جداول مختلفة.ما يقرب من نصف هذه السجلات المكررة.لا يوجد فريدة من نوعها تحديد العمود (id, name إلخ).لا يوجد معرف العمود الذي السيارات تعبئة عندما الجداول تم الجمع بين معنى أن يكرر ليست متطابقة تماما (على الرغم من أن هذا يمكن أن يكون العمود إزالتها إذا ما يجعل الأمور أسهل).

لقد استخدمت الوصول العثور على التكرارات معالج استعلام الذي يعطيني قائمة من تكرار السجلات ولكن لن يسمح لي حذفها (على محمل الجد ما هو استخدام هذا الاستعلام إذا كنت لا يمكن حذفها؟).لقد حاولت تحويل ولدت الاستعلام إلى إزالة الاستعلام ولكن الذي يتغير عدد الصفوف التي يجدها.أود تغيير sql باليد ولكن هذا قليلا خارج عن ارادتي و 7 خطوط طويلة.

لا أحد يعرف طريقة جيدة للتخلص من غيره ؟

هل كانت مفيدة؟

المحلول

والسبب البحث عن التكرارات الاستعلام لن تمكنك من حذف السجلات لأنه هو في الأساس مجرد تجميع الاستعلام يتم حساب عدد التكرارات يجد وإعادة الحالات التي يكون فيها عدد أكبر من 1.

ضع في الاعتبار أنه إذا كنت لم تجعل استعلام حذف على أساس البحث عن التكرارات ، فإنه حذف كافة الصفوف التي تحتوي على قيم مكررة, ربما هو لا ما تريد.كنت ترغب في حذف كافة ولكن واحد من التكرارات.

يجب أن تحاول حذف جميع نسخ من سجل وبصرف النظر عن واحد ، باستثناء معرف العمود في المقارنة الخاصة بك.أقترح أبسط طريقة للقيام بذلك هو أن تجعل استعلام تكوين جدول جميع قيم فريدة (Select Distinct Field1 ومن, Field2...من الجدول) بدلا عن كل مجال إلا على حقل معرف باستخدام يؤدي إلى إنشاء جدول جديد من حوالي 2000 السجلات (إذا كان النصف التكرارات).

ثم إنشاء عمود معرف في الجدول الجديد الخاص بك, استخدام استعلام "تحديث" لتحديث هذه الهوية الأولى مطابقة معرف في الجدول الأصلي (يمكنك القيام بذلك باستخدام DLookup, الذي سيعود أول قيمة التعبير حيث المعايير الحقيقية في المجال).

الدالة DLookup() بإرجاع واحد قيمة من حقل واحد حتى لو أكثر أكثر من سجل واحد يفي معايير.إذا سجل لا يفي المعايير أو إذا كان المجال لا يحتوي على سجلات DLookup() بإرجاع قيمة خالية Null.

منذ كنت في تحديد أول من مطابقة الهوية على أساس كل المجالات الأخرى التي هي فريدة من نوعها القيم لا مثيل لها معرفات سوف تنتمي إلى التكرارات.سوف تكون عكس PK العلاقة وتحديد أول مطابقة مفتاح ضوء مجموعة فريدة من المجالات.بعد ذلك, يجب عليك تعيين معرف PK.طبعا هذا يفترض معرف لا معنى متأصل و لا يهتمون بالحفاظ على واحد معين معرف معين تكرار الصف أكثر من أي معرفات تابعة أخرى تكرار الصفوف.هذا يفترض يهمك البيانات في عمود معرف إذا كنت ترغب في الحفاظ عليه من أجل جميع الصفوف المتبقية ، وإلا تجاهل DLookup الخطوة والقيام حدد متميزة على كافة الأعمدة وبصرف النظر عن الهوية.

نصائح أخرى

استخدم مختارة مع كافة الأعمدة باستثناء العمود ID:

SELECT DISTINCTROW Column1, Column2, Column3 
INTO MYNEWTABLE
FROM TABLE

ويمكنك ببساطة تبديل الأسماء.

وهذا الحل سوف اعطيكم الجدول الجديد مع غير مكررة.

وفيما يلي سوف تحافظ معرفات الأصلية ويفعل ذلك في خطوة واحدة:

DELETE FROM table_with_duplicates 
WHERE table_with_duplicates.id NOT IN 
    (SELECT max(id) 
    FROM table_with_duplicates 
    GROUP BY duplicated_field_1, duplicated_field_2, ...
    )

والآن لديك الجدول الأصلي مع عدم وجود التكرارات وهويات الحفاظ عليها. وتذكر دائما أن البيانات التي احتياطية قبل محاولة الحذف كبيرة.

DELETE * FROM table_with_duplicates
WHERE table_with_duplicates.ID In 
    (SELECT max(ID) 
     FROM table_with_duplicates 
     GROUP BY [duplicated_field_1] 
     HAVING Count(*)>1
    )

والواقع أنني وجدت استغرق وهناك حل بسيط جدا من الوقت ولكن كل من الحقول هي في نفس كأنه سجل مكررة كامل فقط ثم جعل استعلام واحد مع كل مجال ونوع من "مجموعة BY". وهكذا التكرارات سوف تجمع ويمكنك فقط إلحاق هذه المعلومات إلى جدول جديد وتسميته نفس الجدول الموجود. إذا كان لديك حقل المفتاح الأساسي الذي يمكن تجاهله في الاستعلام ومن ثم فإنه لا يزال الجمع بين البيانات (على افتراض أنك لا تبالي البيانات في الحقل الأساسي). أنا لا أعرف لماذا لا أحد قد ذكر هذا الحل أخذني 5 ساعة. من أجل التوصل الى. :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top