Rumah  >  Artikel  >  pangkalan data  >  Ringkaskan dan susun kaedah biasa untuk mengalih keluar data pendua daripada pangkalan data Oracle

Ringkaskan dan susun kaedah biasa untuk mengalih keluar data pendua daripada pangkalan data Oracle

WBOY
WBOYke hadapan
2022-08-22 17:59:303328semak imbas

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.

Ringkaskan dan susun kaedah biasa untuk mengalih keluar data pendua daripada pangkalan data Oracle

Tutorial yang disyorkan: "Tutorial Video Oracle"

Mencipta data ujian

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

Untuk lajur yang ditentukan, semak set keputusan selepas penyahduplikasian

kaedah

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.

row_number()

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.

Untuk lajur yang ditentukan, cari semua baris pendua

kiraan mempunyai

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.

kira lebih

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.

Padam semua baris pendua

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.

Padamkan data pendua dan simpan satu

Kaedah fungsi analitik

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".

kumpulan mengikut

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!

Kenyataan:
Artikel ini dikembalikan pada:jb51.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam