سؤال

لدي جدول في قاعدة البيانات الخاصة بي يحتوي على سجلات مكررة وأريد حذفها.لا أريد إنشاء جدول جديد بإدخالات مميزة لهذا الغرض.ما أريده هو حذف الإدخالات المكررة من الجدول الموجود دون إنشاء أي جدول جديد.هل هناك أي طريقة للقيام بذلك؟

 id           action
 L1_name      L1_data
 L2_name      L2_data
 L3_name      L3_data   
 L4_name      L4_data
 L5_name      L5_data
 L6_name      L6_data
 L7_name      L7_data
 L8_name      L8_data
 L9_name      L9_data
 L10_name     L10_data
 L11_name     L11_data
 L12_name     L12_data
 L13_name     L13_data 
 L14_name     L14_data
 L15_name     L15_data

انظر هذه كلها حقولي:
المعرف فريد لكل صف.
L11_data فريد لمجال الإجراء المعني.
L11_data له أسماء شركات بينما الإجراء له اسم الصناعات.

لذا، لدي في بياناتي اسم مكرر للشركات في L11_data للصناعات الخاصة بها.

ما أريده هو أن يكون لدي اسم فريد وبيانات أخرى خاصة بالشركات في صناعة معينة مخزنة أثناء العمل.آمل أن أكون قد ذكرت مشكلتي بطريقة يمكن أن يفهمها الناس.

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

المحلول

نعم، بافتراض أن لديك حقل معرف فريد، يمكنك حذف كافة السجلات المتشابهة باستثناء المعرف، ولكن ليس لديها "الحد الأدنى للمعرف" لمجموعة القيم الخاصة بها.

مثال للاستعلام:

DELETE FROM Table
WHERE ID NOT IN
(
SELECT MIN(ID)
FROM Table
GROUP BY Field1, Field2, Field3, ...
)

ملحوظات:

  • لقد اخترت بحرية "الجدول" و"المعرف" كأسماء تمثيلية
  • يجب أن تتضمن قائمة الحقول ("Field1، Field2، ...") جميع الحقول باستثناء المعرف
  • قد يكون هذا استعلامًا بطيئًا اعتمادًا على عدد الحقول والصفوف، لكنني أتوقع أنه سيكون جيدًا مقارنة بالبدائل

يحرر:في حالة عدم وجود فهرس فريد لديك، فإن توصيتي هي ببساطة إضافة فهرس فريد متزايد تلقائيًا.ويرجع ذلك أساسًا إلى تصميمه الجيد، وأيضًا لأنه سيسمح لك بتشغيل الاستعلام أعلاه.

نصائح أخرى

ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols);

وتكرار الحصول فارغة، ثم يمكنك حذفها

DELETE
FROM table_x a
WHERE rowid < ANY (
  SELECT rowid
  FROM table_x b
  WHERE a.someField = b.someField
   AND a.someOtherField = b.someOtherField
  )
WHERE (
  a.someField,
  a.someOtherField
  ) IN (
  SELECT c.someField,
   c.someOtherField
  FROM table_x c
  GROUP BY c.someField,
   c.someOtherField
  HAVING count(*) > 1
  )

في الاستعلام أعلاه الجمع بين someField وsomeOtherField يجب تحديد التكرارات متميز.

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