Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Memadam Baris Pendua dengan Cekap dari Jadual dalam SQL?

Bagaimana untuk Memadam Baris Pendua dengan Cekap dari Jadual dalam SQL?

Mary-Kate Olsen
Lepaskan: 2025-01-19 02:47:08
asal
181 orang telah melayarinya

How to Efficiently Delete Duplicate Rows from a Table in SQL?

SQL: Menghapuskan Baris Pendua dalam Jadual

Cabaran:

Anda berhadapan dengan jadual yang tidak mempunyai kunci utama atau kekangan, mengandungi berbilang baris dengan data yang sama. Matlamatnya adalah untuk mengalih keluar baris pendua, mengekalkan hanya satu contoh bagi setiap baris unik. Kami akan menggunakan lajur bernama "kunci" untuk mengenal pasti pendua, memastikan hanya satu entri wujud untuk setiap nilai "kunci" yang berbeza.

Penyelesaian:

Proses ini melibatkan dua langkah utama:

  1. Mengenal pasti Kejadian Pertama: Cari tika awal setiap baris pendua.
  2. Mengalih Keluar Pendua Seterusnya: Padamkan semua baris yang bukan kejadian pertama yang dikenal pasti dalam langkah 1.

Arahan SQL berikut mencapai ini:

DELETE FROM dups a USING (
    SELECT MIN(ctid) as ctid, key
    FROM dups 
    GROUP BY key HAVING COUNT(*) > 1
) b
WHERE a.key = b.key 
AND a.ctid <> b.ctid;
Salin selepas log masuk

Nota Penting: Kaedah ini tidak menawarkan kawalan ke atas baris tertentu yang dikekalkan.

Contoh Ilustrasi:

Pertimbangkan jadual contoh ini:

CREATE TABLE people (
    name    varchar(50) NOT NULL,
    surname varchar(50) NOT NULL,
    age     integer NOT NULL
);

INSERT INTO people (name, surname, age) VALUES 
    ('A.', 'Tom', 30),
    ('A.', 'Tom', 10),
    ('B.', 'Tom', 20),
    ('B', 'Chris', 20);
Salin selepas log masuk

Untuk mencari kejadian pertama pendua:

SELECT MIN(ctid) as ctid, name, surname
FROM people 
GROUP BY (name, surname) HAVING COUNT(*) > 1;
Salin selepas log masuk

Output:

ctidnamesurname
(0,1)A.Tom

Memadamkan pendua bukan pertama:

DELETE FROM people a USING (
    SELECT MIN(ctid) as ctid, name, surname
    FROM people 
    GROUP BY (name, surname) HAVING COUNT(*) > 1
) b
WHERE a.name = b.name
AND a.surname = b.surname
AND a.ctid <> b.ctid;
Salin selepas log masuk

Barisan yang tinggal:

SELECT * FROM people;
Salin selepas log masuk

Output:

name surname age
A. Tom 30
B. Tom 20
B Chris 20

Atas ialah kandungan terperinci Bagaimana untuk Memadam Baris Pendua dengan Cekap dari Jadual dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan