أسرع النصي SQL "الحصول على التكرارات"
-
10-07-2019 - |
سؤال
ما هو مثال على SQL سريع للحصول على التكرارات في قواعد البيانات مع مئات الآلاف من السجلات. أنا عادة استخدام شيء مثل:
SELECT afield1, afield2 FROM afile a
WHERE 1 < (SELECT count(afield1) FROM afile b WHERE a.afield1 = b.afield1);
ولكن هذا هو بطيء جدا.
المحلول
وهذه هي طريقة أكثر مباشرة:
select afield1,count(afield1) from atable
group by afield1 having count(afield1) > 1
نصائح أخرى
ويمكنك أن تحاول:
select afield1, afield2 from afile a
where afield1 in
( select afield1
from afile
group by afield1
having count(*) > 1
);
وسئل سؤال مماثل الأسبوع الماضي. هناك بعض الإجابات جيدة هناك.
SQL للعثور على إدخالات مكررة (ضمن مجموعة) أ >
في هذا السؤال، وكان OP المهتمين في جميع الأعمدة (الحقول) في الجدول (ملف)، ولكن صفوف تنتمي في نفس المجموعة إذا كانت لديهم نفس قيمة المفتاح (afield1).
وهناك ثلاثة أنواع الردود:
والاستعلامات الفرعية في بند فيها، مثل بعض إجابات أخرى هنا.
وصلة داخلية بين الجدول والجماعات ينظر إليه باعتباره الجدول (جوابي)
ووالاستفسارات التحليلية (وهو ما هو جديد بالنسبة لي).
وبالمناسبة، إذا كان أي شخص يريد أن إزالة التكرارات، ولقد استخدمت هذا:
delete from MyTable where MyTableID in (
select max(MyTableID)
from MyTable
group by Thing1, Thing2, Thing3
having count(*) > 1
)
وهذا يجب أن يكون سريع معقول (حتى أسرع إذا تم فهرسة dupeFields).
SELECT DISTINCT a.id, a.dupeField1, a.dupeField2
FROM TableX a
JOIN TableX b
ON a.dupeField1 = b.dupeField2
AND a.dupeField2 = b.dupeField2
AND a.id != b.id
وأعتقد أن الجانب السلبي الوحيد لهذا الاستعلام هو أن لأنك لا تقوم COUNT(*)
لم تتمكن من التحقق ل<م> عدد المرات م> تتكرر عليه، إلا أنه يبدو أكثر من مرة.