Oracle
 sql >> база данни >  >> RDS >> Oracle

2 начина за изтриване на дублиращи се редове в Oracle

Следните опции могат да се използват за изтриване на дублиращи се редове в Oracle Database.

Тези примери изтриват дублиращи се редове, но запазват един. Така че, ако има три еднакви реда например, той изтрива два от тях и запазва един. Това често се нарича премахване на дупли на масата.

Примерни данни

Да предположим, че имаме таблица със следните данни:

SELECT * FROM Pets;

Резултат:

PETID	PETNAME	PETTYPE
1	Wag	Dog
1	Wag	Dog
2	Scratch	Cat
3	Tweet	Bird
4	Bark	Dog
4	Bark	Dog
4	Bark	Dog

Можем да видим, че първите два реда са дублирани, както и последните три реда.

В този случай всички колони са дублирани. Няма колона с първичен ключ. Обикновено може да се очаква PetId колоната да бъде първичен ключ, но съдържа дублиращи се стойности и следователно не може да бъде първичен ключ.

Ако беше първичен ключ, той щеше да съдържа уникални стойности във всички редове и нямаше да има дубликати.

Независимо от това, по-долу са две опции за намиране и изтриване на дублиращи се редове, дори когато няма първичен ключ.

Опция 1

Ето една опция за премахване на дублиращи се редове от горната таблица:

DELETE FROM Pets
WHERE EXISTS (
  SELECT 1 FROM Pets p2 
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
  AND Pets.rowid > p2.rowid
);

SELECT * FROM Pets;

Резултат:

3 row(s) deleted.

PETID	PETNAME	PETTYPE
1	Wag	Dog
2	Scratch	Cat
3	Tweet	Bird
4	Bark	Dog

Сега масата е премахната. Три реда бяха изтрити, а четири остават.

Един от дублиращите се редове за нашето куче „Wag” е изтрит, а другият остава. Два от дублиращите се редове за „Кора“ също бяха изтрити.

rowid на Oracle pseudocolumn ни позволи да извършим тази операция за де-дупиране. Успяхме да го посочим в нашата заявка, за да определим кои редове да изтрием.

Начинът, по който това работи, е, че всеки ред в база данни на Oracle има rowid псевдоколона, която връща адреса на реда. rowid е уникален идентификатор за редове в таблицата и обикновено неговата стойност уникално идентифицира ред в базата данни. Следователно можем да идентифицираме всеки ред, дори когато нямаме първичен ключ или друго поле за уникален идентификатор.

Важно е обаче да се отбележи, че редовете в различни таблици, които се съхраняват заедно в един и същ клъстер, могат да имат един и същ rowid .

Опция 2

Ако приемем, че таблицата е била възстановена с оригиналните си данни (включително дублиращи се редове), ето още една опция за изтриване на дублиращи се редове.

DELETE FROM Pets
WHERE rowid > (
  SELECT MIN(rowid) FROM Pets p2  
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
);

SELECT * FROM Pets;

Резултат:

PETID	PETNAME	PETTYPE
1	Wag	Dog
2	Scratch	Cat
3	Tweet	Bird
4	Bark	Dog

Същият резултат като предишния пример.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle Брави и ключалки за маса:Как работи

  2. Как да върна набор от резултати/курсор от анонимен блок на Oracle PL/SQL, който изпълнява Dynamic SQL?

  3. Oracle Еквивалент на MySQL INSERT IGNORE?

  4. Как мога да предам параметър на t-sql скрипт?

  5. LEAD и LAG аналитични функции