Следните опции могат да се използват за изтриване на дублиращи се редове в 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
Същият резултат като предишния пример.