sql >> Database >  >> RDS >> Oracle

verwijder dubbele rijen uit Oracle

Om verschillende redenen in de database moeten we vaak dubbele rijen uit de Oracle-tabel vinden en verwijderen. We moeten vaak verwijderen om de gegevensproblemen op te lossen. Er zijn veel manieren om dubbele rijen te orakelen, maar origineel te houden. Ik zou in dit bericht een paar snellere methoden laten zien om dit te bereiken. Ik zal de methode laten zien waarbij rowid wordt gebruikt en de methode waarbij rowid niet wordt gebruikt. Houd er rekening mee dat u alle kolommen moet identificeren die de rij een duplicaat maken in de tabel en al die kolommen moet specificeren in de juiste delete-instructie in SQL

Dubbele rijen verwijderen uit Oracle

Hier zijn enkele manieren om dubbele rijen op een gemakkelijke manier te verwijderen

(A) Snelle methode, maar je moet alle orakelindexen, triggers opnieuw maken

create table my_table1 as select distinct * from my_table;
drop my_table;
rename my_table1 to my_table;

Voorbeeld

SQL> select * from mytest;
ID NAME
------
1 TST 
2 TST 
1 TST

SQL> create table mytest1 as select distinct * from mytest;
Table created.

SQL> select * from mytest1;
ID NAME
-------
2 TST 
1 TST
SQL> drop table mytest;
Table dropped.
SQL> rename mytest1 to mytest;
Table renamed.
SQL> select * from mytest;
ID NAME
-------
2 TST
1 TST

(B) Hoe dubbele records in orakel te vinden en te verwijderen met rowid. Het onderstaande voorbeeld toont één kolom. Als u verwijderen op basis van twee kolommen heeft, kunt u twee kolommen specificeren

Delete from my_table where rowid not in (
select max(rowid) from my_table group by my_col_name );

(C)   Gebruik oracle self-join om dubbele rijen te verwijderen

DELETE FROM my_table A WHERE ROWID > (SELECT min(rowid) FROM my_table B WHERE A.key_values = B.key_values);

(D) Gebruik bestaat clausule

delete from my_table t1
where exists (select 'x' from my_table t2
where t2.key_value1 = t1.key_value1
and t2.key_value2 = t1.key_value2
and t2.rowid > t1.rowid);

(E) dubbele records verwijderen bij het gebruik van orakelanalysefuncties

delete from my_table
where rowid in
(select rid
from
( select
rowid rid,
row_number() over (partition by column_name order by rowid) rn
from my_table)
where rn <> 1
)

Zoals weergegeven, zijn er veel manieren om dubbele rijen in de tabellen te verwijderen. Deze opdracht kan in veel situaties van pas komen en kan worden gebruikt, afhankelijk van de vereiste. Zorg er altijd voor dat we een back-up beschikbaar hebben voordat u instructies uitvoert. We moeten ook eerst het duplicaat vinden met behulp van de zoekopdracht en deze vervolgens verifiëren voordat we deze uitvoeren

hoe dubbele records in oracle te vinden met rowid

select * from my_table
where rowid not in
(select max(rowid) from my_table group by column_name);

Dus zoek eerst het duplicaat met behulp van de bovenstaande zoekopdracht en verwijder deze vervolgens. Het aantal verwijderingen moet hetzelfde zijn als het aantal rijen van de bovenstaande zoekopdracht. Voer nu de zoekopdracht duplicaat opnieuw uit. Als er geen duplicaat is, zijn we goed voor commit

Bekijk het onderstaande artikel om een ​​diepe duik te nemen in Sql

Oracle Sql-zelfstudies:Bevat de lijst met alle nuttige Oracle SQL-artikelen. Verken ze om meer te weten te komen over Oracle Sql, zelfs als u Oracle Sql kent
Oracle-interviewvragen:bekijk deze pagina voor de top 49 Oracle-interviewvragen en -antwoorden:basisprincipes, Oracle SQL om u te helpen bij interviews. Er wordt ook aanvullend materiaal verstrekt
br/>where-clausule in orakel:beperking van de dataset, waar-clausule, wat is waar-clausule in sql-instructie, vergelijkingsoperator
enkele rij-functies in Oracle:bekijk dit om erachter te komen Enkele rij-functies in sql, Oracle-gegevens functies,Numerieke functies in sql ,Tekenfunctie in sql
oracle sql-query's
blog.oracle.com


  1. SQL NIET IN werkt niet

  2. Hoe geen duplicaten in SQL te tonen

  3. Hoe u id's op Bijlagen kunt retourneren met Ibatis (met RETURNING-sleutelwoord)

  4. Vind entiteiten waarnaar wordt verwezen in SQL Server:sys.dm_sql_referenced_entities