วิธีการ ลบแถวที่ซ้ำกัน
จากตาราง 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 ของคุณได้อย่างมั่นใจ ขอให้สนุกกับการทำการค้นหา!