วิธีการ ลบแถวที่ซ้ำกัน จากตาราง SQL Server อย่างง่าย

การทำความสะอาดฐานข้อมูลของคุณเป็นสิ่งจำเป็นสำหรับการรักษาคุณภาพข้อมูล โดยเฉพาะอย่างยิ่งเมื่อมี แถวที่ซ้ำกัน หากคุณทำงานกับตาราง SQL Server ขนาดใหญ่—มากกว่า 300,000 แถวเป็นต้น—คุณอาจพบปัญหาสิ่งที่ซ้ำกันที่คุณต้องการลบ ในโพสต์บล็อกนี้ เราจะให้คำแนะนำที่ตรงไปตรงมาในการกำจัดข้อมูลซ้ำในขณะที่เก็บรักษาข้อมูลที่เกี่ยวข้องไว้ให้ครบถ้วน

เข้าใจปัญหา

เมื่อคุณมีตารางอย่าง MyTable ซึ่งรวมถึงคีย์หลักที่มีฟิลด์ไอดี (RowID) ข้อมูลที่ซ้ำกันจะไม่ปรากฏเป็นที่ตรงกันแบบสมบูรณ์ แทนที่จะเป็นเช่นนั้น มันอาจแตกต่างกันในหนึ่งหรือมากกว่าคอลัมน์ที่ไม่ใช่คีย์ เช่น Col1, Col2 และ Col3 จึงมีความจำเป็นในการระบุข้อมูลซ้ำอย่างชาญฉลาดเพื่อหลีกเลี่ยงการสูญเสียข้อมูลในขณะที่ยังคงรักษาความถูกต้องของตารางของคุณ

โครงสร้างตัวอย่างของ MyTable

RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null

อธิบายวิธีการแก้ไข

เพื่อที่จะลบแถวที่ซ้ำกันได้อย่างมีประสิทธิภาพในขณะที่เก็บแถวที่เกี่ยวข้อง คุณสามารถใช้คำสั่ง GROUP BY และคำสั่ง DELETE ของ SQL Server ด้านล่างนี้คือขั้นตอนที่แยกย่อยเพื่อความชัดเจน

คู่มือทีละขั้นตอน

1. การจัดกลุ่มและเลือกแถวที่ไม่ซ้ำกัน

ขั้นตอนแรกคือการจัดกลุ่มแถวตามคอลัมน์ที่คุณต้องการตรวจสอบสำหรับข้อมูลที่ซ้ำกัน ในกรณีนี้คือ Col1, Col2 และ Col3 คุณจะใช้ฟังก์ชัน MIN เพื่อหาค่า RowID ที่น้อยที่สุดสำหรับแต่ละกลุ่มที่ซ้ำกัน ซึ่งจะช่วยบอกคุณว่าแถวไหนที่ควรเก็บไว้

นี่คือโค้ด SQL ที่อาจดูเช่นนี้:

SELECT MIN(RowId) as RowId, Col1, Col2, Col3 
FROM MyTable 
GROUP BY Col1, Col2, Col3

2. ลบข้อมูลที่ซ้ำกัน

เมื่อคุณได้ระบุว่าแถวไหนที่ควรเก็บไว้แล้ว ขั้นตอนถัดไปคือการลบทุกอย่างที่ไม่มีตัวแทนในชุด KeepRows ที่คุณสร้างขึ้นใหม่ นี่คือโค้ด SQL ที่ใช้สำหรับการลบ:

DELETE FROM MyTable
LEFT OUTER JOIN (
   SELECT MIN(RowId) as RowId, Col1, Col2, Col3 
   FROM MyTable 
   GROUP BY Col1, Col2, Col3
) as KeepRows ON
   MyTable.RowId = KeepRows.RowId
WHERE
   KeepRows.RowId IS NULL

คำสั่งนี้มีผลดังนี้:

  • ทำการ LEFT OUTER JOIN ระหว่าง MyTable และ KeepRows ที่คำนวณ
  • แถวใด ๆ ใน MyTable ที่ไม่ตรงกับ RowId ใน KeepRows จะถูกลบออก

การจัดการกับตัวระบุที่ไม่ซ้ำกัน

หากตารางของคุณรวมถึง GUID แทนการใช้จำนวนเต็มสำหรับการระบุแถว เพียงแค่ปรับการเลือก MIN ของคุณ เปลี่ยน:

MIN(RowId)

เป็น:

CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn)))

สิ่งนี้จะทำให้คุณมั่นใจได้ว่าคุณกำลังระบุ GUID ที่น้อยที่สุดอย่างถูกต้องในขณะที่ยังรักษาความถูกต้องของประเภทข้อมูล

สรุป

การลบแถวที่ซ้ำกันจาก SQL Server สามารถทำได้อย่างมีประสิทธิภาพโดยใช้ GROUP BY และเทคนิคการเชื่อมโยงและการลบที่เกี่ยวข้อง ด้วยการปฏิบัติตามขั้นตอนเหล่านี้ คุณสามารถรักษาฐานข้อมูลให้สะอาดและใช้งานได้โดยไม่เสี่ยงต่อการสูญเสียข้อมูลสำคัญ โปรดจำไว้ว่าควรสำรองข้อมูลของคุณก่อนดำเนินการลบจำนวนมากเพื่อความปลอดภัย!

ด้วยความรู้ที่คุณได้เรียนรู้ในที่นี้ คุณสามารถจัดการกับปัญหาข้อมูลที่ซ้ำกันในตาราง SQL ของคุณได้อย่างมั่นใจ ขอให้สนุกกับการทำการค้นหา!