Rumah > Artikel > pangkalan data > deduplikasi data oracle
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);
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);
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
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;
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;
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;
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!