מחיקת רשומות כפולות

15/12/2009

אין תגובות

לעיתים נוצרות בטבלת עזר רשומות כפולות בשל טעות בקוד שהכניס פנימה נתונים או אולי בגלל כפילות מידע במקורות המידע השונים שמזינים אותה, וכעת יש למחוק כך שמכל רשומה – תישאר רק אחת.

פעם הסיפור היה מסובך: היינו בונים טבלת עזר, מעבירים את הנתונים מהטבלה המקורית לטבלת העזר בעזרת Distinct, מוחקים את הנתונים מהטבלה המקורית, מעתיקים את הנתונים מטבלת העזר לטבלה המקורית, ולסיום- מבטלים את טבלת העזר..

כיום זה קצת יותר פשוט:

ניצור טבלה להדגמה

   Create Table #Tmp(name VarChar(Max),



                    object_id Int,



                    schema_id Int,



                    type_desc VarChar(100));

נכניס לתוכה 5 פעמים את הנתונים מטבלת המערכת sys.objects (בעזרת פטנט נחמד שלא מזיק להכיר)

    Insert Into #Tmp



    Select    name,



            object_id,



            schema_id,



            type_desc



    From    sys.objects;



    Go 5

ניתן לראות בקלות שכל רשומה מופיעה 5 פעמים

    Select    *



    From    #Tmp



    Order By object_id;

כעת ניצור CTE שממספר את השורות הכפולות, ונשתמש בו כדי למחוק את כל אלו שהמספר שלהן גדול או שווה 2

    With T As



    (Select    Row_Number() Over (Partition By name,object_id,schema_id,type_desc Order By name) Num



    From    #Tmp)



    Delete



    From    T



    Where    Num>=2;

ונוודא שלא נותרו רשומות כפולות

    Select name,object_id,schema_id,type_desc



    From    #Tmp



    Group By name,object_id,schema_id,type_desc



    Having Count(*)>1;

הערות: ב-CTE יש לציין ברשימת השדות של ה-Partition By את כל השדות שבטבלה,

וב-Order By את אחד השדות – לא משנה איזה (ממילא כל הרשומות זהות).

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *