Artikel ini membawakan anda pengetahuan yang berkaitan tentang Oracle Ia terutamanya memperkenalkan data pendua dalam jadual yang sering dikosongkan semasa pembersihan data. Jadi bagaimana untuk menanganinya dalam Oracle? Mari kita lihat bersama-sama, saya harap ia akan membantu semua orang.
Tutorial yang disyorkan: "Tutorial Video Oracle"
create table nayi224_180824(col_1 varchar2(10), col_2 varchar2(10), col_3 varchar2(10)); insert into nayi224_180824 select 1, 2, 3 from dual union all select 1, 2, 3 from dual union all select 5, 2, 3 from dual union all select 10, 20, 30 from dual ; commit; select*from nayi224_180824;
COL_1 | COL_2 | COL_3 |
---|---|---|
1 | 2 | 3 |
1 | 2 | 3 |
5 | 2 | 3 |
10 | 20 | 30 |
select distinct t1.* from nayi224_180824 t1;
COL_1 | COL_2 | COL_3 |
---|---|---|
10 | 20 | 30 |
1 | 2 | 3 |
5 | 2 | 3 |
adalah sangat terhad, kerana ia hanya boleh menyahduplikasi semua lajur pertanyaan. Jika saya ingin menyahduplikasi col_2 dan col3, maka set hasil saya hanya boleh mempunyai lajur col_2 dan col_3, tetapi bukan col_1.
select distinct t1.col_2, col_3 from nayi224_180824 t1
COL_2 | COL_3 |
---|---|
2 | 3 |
20 | 30 |
Tetapi ia juga merupakan cara yang paling mudah dan paling mudah untuk difahami.
select * from (select t1.*, row_number() over(partition by t1.col_2, t1.col_3 order by 1) rn from nayi224_180824 t1) t1 where t1.rn = 1 ;
COL_1 | COL_2 | COL_3 | RN |
---|---|---|---|
1 | 2 | 3 | 1 |
10 | 20 | 30 | 1 |
Menulis lebih menyusahkan, tetapi ia mempunyai fleksibiliti yang lebih besar.
select * from nayi224_180824 t where (t.col_2, t.col_3) in (select t1.col_2, t1.col_3 from nayi224_180824 t1 group by t1.col_2, t1.col_3 having count(1) > 1)
COL_1 | COL_2 | COL_3 |
---|---|---|
1 | 2 | 3 |
1 | 2 | 3 |
5 | 2 | 3 |
Jadual perlu disemak dua kali, yang akan menjadi tidak cekap. Tidak disyorkan.
select * from (select t1.*, count(1) over(partition by t1.col_2, t1.col_3) rn from nayi224_180824 t1) t1 where t1.rn > 1 ;
COL_1 | COL_2 | COL_3 | RN |
---|---|---|---|
1 | 2 | 3 | 3 |
1 | 2 | 3 | 3 |
5 | 2 | 3 | 3 |
Hanya semak jadual sekali sahaja, disyorkan.
delete from nayi224_180824 t where t.rowid in ( select rid from (select t1.rowid rid, count(1) over(partition by t1.col_2, t1.col_3) rn from nayi224_180824 t1) t1 where t1.rn > 1);
Hanya ubah suai sedikit pernyataan di atas.
delete from nayi224_180824 t where t.rowid in (select rid from (select t1.rowid rid, row_number() over(partition by t1.col_2, t1.col_3 order by 1) rn from nayi224_180824 t1) t1 where t1.rn > 1);
Mempunyai fleksibiliti tinggi yang konsisten bagi fungsi analitik. Anda boleh melakukan apa sahaja yang anda mahu dengan pengelompokan dan menukar klausa orderby untuk mencapai keperluan seperti "kekalkan id maksimum".
delete from nayi224_180824 t where t.rowid not in (select max(rowid) from nayi224_180824 t1 group by t1.col_2, t1.col_3);
mengorbankan sedikit fleksibiliti sebagai pertukaran untuk kecekapan yang lebih tinggi.
Tutorial yang disyorkan: "Tutorial Video Oracle"
Atas ialah kandungan terperinci Ringkaskan dan susun kaedah biasa untuk mengalih keluar data pendua daripada pangkalan data Oracle. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!