Rumah> pangkalan data> Oracle> teks badan

deduplikasi data oracle

WBOY
Lepaskan: 2023-05-18 09:32:07
asal
1332 orang telah melayarinya

Memandangkan data perusahaan terus berkembang, data pendua telah menjadi isu penting dalam pengurusan pangkalan data. Dalam pangkalan data Oracle, data pendua akan membawa kepada hasil pertanyaan yang tidak tepat, menggunakan ruang storan dan menjejaskan prestasi pangkalan data. Oleh itu, deduplikasi adalah perlu.

Artikel ini akan memperkenalkan beberapa kaedah untuk memadamkan data pendua dalam pangkalan data Oracle.

Kaedah 1: Menggunakan subkueri dan pengelompokan

Sebelum memadamkan data pendua, kita perlu memahami dahulu apa itu data pendua. Dalam pangkalan data Oracle, dua atau lebih rekod adalah pendua jika mereka mempunyai semua lajur yang sama.

Berikut ialah jadual sampel yang mengandungi data pendua:

CREATE TABLE employee( emp_id NUMBER(6), first_name VARCHAR2(50), last_name VARCHAR2(50), dept_id NUMBER(4) ); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(1, 'John', 'Doe', 101); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(2, 'Jane', 'Doe', 102); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(3, 'John', 'Doe', 101); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(4, 'Bob', 'Smith', 103);
Salin selepas log masuk

Jika kami ingin mengalih keluar data pendua dan hanya menyimpan satu rekod untuk setiap pekerja, kami boleh menggunakan pernyataan pertanyaan SQL berikut:

DELETE FROM employee WHERE emp_id IN (SELECT emp_id FROM (SELECT emp_id, ROW_NUMBER() OVER (PARTITION BY first_name, last_name, dept_id ORDER BY emp_id) rn FROM employee) WHERE rn <> 1);
Salin selepas log masuk

Pernyataan SQL ini menggunakan subquery yang menggunakan fungsi ROW_NUMBER untuk mengenal pasti baris pertama setiap pekerja. Kemudian ia memadam semua baris yang tinggal.

Penyata PARTITION BY digunakan untuk mengumpulkan baris dalam setiap jabatan, dan ORDER BY pernyataan mengisih baris dalam susunan emp_id. Selepas melaksanakan fungsi ROW_NUMBER, kami mendapat keputusan berikut:

EMP_ID | FIRST_NAME | LAST_NAME | DEPT_ID | RN -------|------------|-----------|---------|----- 1 | John | Doe | 101 | 1 2 | Jane | Doe | 102 | 1 3 | John | Doe | 101 | 2 4 | Bob | Smith | 103 | 1
Salin selepas log masuk

Di sini kita dapat melihat bahawa dalam jabatan yang sama, John Doe berada di kedudukan 1 dan 3, yang bermaksud terdapat dua rekod John Doe . Dengan mengalih keluar semua baris dengan rn tidak sama dengan 1, kami boleh mengalih keluar data pendua dan menyimpan satu baris untuk setiap pekerja.

Kaedah 2: Gunakan jadual sementara

Kaedah lain ialah menggunakan jadual sementara, yang menyimpan data yang perlu kita simpan. Kita boleh menggunakan pertanyaan SQL berikut:

CREATE TABLE temp_employee AS SELECT DISTINCT emp_id, first_name, last_name, dept_id FROM employee;
Salin selepas log masuk

Pernyataan ini akan memilih emp_id, first_name, last_name dan dept_id yang unik daripada jadual pekerja dan memasukkannya ke dalam jadual baharu yang dipanggil temp_employee.

Kini kita boleh memadamkan semua baris daripada jadual pekerja dan mengalihkan baris daripada jadual temp_employee kembali ke jadual pekerja menggunakan pernyataan SQL berikut:

DELETE FROM employee; INSERT INTO employee(emp_id, first_name, last_name, dept_id) SELECT emp_id, first_name, last_name, dept_id FROM temp_employee;
Salin selepas log masuk

Ini akan memadamkan semua baris daripada jadual pekerja , dan masukkan baris daripada jadual temp_employee ke dalam jadual pekerja. Kini kami telah mengalih keluar semua rekod pendua dan mengekalkan satu baris untuk setiap pekerja.

Kaedah 3: Menggunakan fungsi CTE dan ROW_NUMBER

Ini adalah kaedah lain yang menggunakan fungsi ROW_NUMBER, tetapi ia menggunakan ungkapan biasa (CTE). Pernyataan pertanyaan SQL berikut boleh digunakan untuk mengalih keluar data pendua:

WITH emp AS( SELECT emp_id, first_name, last_name, dept_id, ROW_NUMBER() OVER(PARTITION BY first_name, last_name, dept_id ORDER BY emp_id) rn FROM employee ) DELETE FROM emp WHERE rn > 1;
Salin selepas log masuk

Pernyataan ini menggunakan ungkapan umum emp, yang merangkumi semua rekod yang perlu kami padamkan dan mengenal pasti rekod pertama dalam setiap kumpulan. Ia kemudian menggunakan pernyataan DELETE untuk memadam baris yang tinggal dalam semua kumpulan.

Kesimpulan

Dalam pangkalan data Oracle, adalah sangat penting untuk mengalih keluar data pendua. Data pendua menjejaskan prestasi pangkalan data, membazir ruang storan dan membawa kepada hasil pertanyaan yang tidak tepat. Artikel ini menerangkan beberapa cara untuk mengalih keluar data pendua, termasuk menggunakan subkueri dan pengumpulan, menggunakan jadual sementara dan menggunakan fungsi CTE dan ROW_NUMBER. Tidak kira kaedah yang anda pilih, pastikan anda menyandarkan data anda sebelum memadamkan rekod, untuk berjaga-jaga.

Atas ialah kandungan terperinci deduplikasi data oracle. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!