konto usunięte

Temat: [postgres] usuwanie zduplikowanych rekordów

Moja baza danych miała małą awarię, po wgraniu backup-u okazało się, że w jednej tabeli zostało zdjęte ograniczenie na primary key i co gorsza pojawiły się w niej zduplikowane rekordy..
Pytanie brzmi: jak usunąć redundantne dane?
Niestety postgres nie obsługuje zapytań w stylu: DELETE * FROM table WHERE id=1 LIMIT 1;
Tomasz Poradowski

Tomasz Poradowski Specjalista od
wytwarzania
oprogramowania

Temat: [postgres] usuwanie zduplikowanych rekordów

Łukasz Bandzarewicz:
Moja baza danych miała małą awarię, po wgraniu backup-u okazało się, że w jednej tabeli zostało zdjęte ograniczenie na primary key i co gorsza pojawiły się w niej zduplikowane rekordy..
Pytanie brzmi: jak usunąć redundantne dane?
Niestety postgres nie obsługuje zapytań w stylu: DELETE * FROM table WHERE id=1 LIMIT 1;
DELETE FROM table WHERE id IN (SELECT DISTINCT id FROM table GROUP BY id HAVING COUNT(*) > 1)
?

konto usunięte

Temat: [postgres] usuwanie zduplikowanych rekordów

mozesz uzyc google :P

http://www.postgresonline.com/journal/index.php?/archi...

:)

konto usunięte

Temat: [postgres] usuwanie zduplikowanych rekordów

Tomasz Poradowski:
DELETE FROM table WHERE id IN (SELECT DISTINCT id FROM table GROUP BY id HAVING COUNT(*) > 1)
?

Ale to usunie wszystkie rekordy z zdublowanym ID. A pasowałoby jeden zostawić.
Piotr Czeczko

Piotr Czeczko Technical Director

Temat: [postgres] usuwanie zduplikowanych rekordów

Ja bym spróbował zrobić to tak:
1. stworzyć tabele ze zduplikowanymi rekordami:
create table dup_rows as
SELECT id, kol1, kol2, ... FROM org_table
GROUP BY id, kol1, kol2, ...
HAVING Count(*)>1
2. usunac wszystkie zduplikowane rekordy:
delete org_table where id in (SELECT id FROM dup_rows);
3. wstawic spowrotem brakujace rekordy:
insert into org_table select * from dup_rows;
4. usunac tabele zduplikowanych rekordow:
drop table dup_rows;
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: [postgres] usuwanie zduplikowanych rekordów

Można przed wywołaniem podanego wyżej zapytania wrzucić po jednym reprezentancie zduplikowanych rekordów do tabeli tymczasowej.

[edit] No właśnie tak jak poprzednik napisał ;-)Przemek Szalko edytował(a) ten post dnia 05.08.08 o godzinie 14:28
Tomasz Poradowski

Tomasz Poradowski Specjalista od
wytwarzania
oprogramowania

Temat: [postgres] usuwanie zduplikowanych rekordów

Krzysztof P.:
Tomasz Poradowski:
DELETE FROM table WHERE id IN (SELECT DISTINCT id FROM table GROUP BY id HAVING COUNT(*) > 1)
?

Ale to usunie wszystkie rekordy z zdublowanym ID. A pasowałoby jeden zostawić.
A, racja, na szybko pisałem ;), poprawka:

DELETE FROM table WHERE oid IN (SELECT MIN(oid) FROM table GROUP BY id HAVING COUNT(*) > 1)

przy założeniu, że tabela ma włączone OIDs (zamiast MIN można też wziąć MAX).
Piotr Czeczko

Piotr Czeczko Technical Director

Temat: [postgres] usuwanie zduplikowanych rekordów

a... rozmyśliłem się :)Piotr Czeczko edytował(a) ten post dnia 05.08.08 o godzinie 14:51

konto usunięte

Temat: [postgres] usuwanie zduplikowanych rekordów

Krzysztof P.:
Tomasz Poradowski:
DELETE FROM table WHERE id IN (SELECT DISTINCT id FROM table GROUP BY id HAVING COUNT(*) > 1)
?

Ale to usunie wszystkie rekordy z zdublowanym ID. A pasowałoby jeden zostawić.

Właśnie tutaj tkwi największy problem..

konto usunięte

Temat: [postgres] usuwanie zduplikowanych rekordów

Piotr Czeczko:
Ja bym spróbował zrobić to tak:
1. stworzyć tabele ze zduplikowanymi rekordami:
create table dup_rows as
SELECT id, kol1, kol2, ... FROM org_table
GROUP BY id, kol1, kol2, ...
HAVING Count(*)>1
2. usunac wszystkie zduplikowane rekordy:
delete org_table where id in (SELECT id FROM dup_rows);
3. wstawic spowrotem brakujace rekordy:
insert into org_table select * from dup_rows;
4. usunac tabele zduplikowanych rekordow:
drop table dup_rows;

Dokładnie o takim rozwiązaniu myślałem. Dzięki za odpowiedź ;)

..swoją drogą, dlaczego postgres nie obsługuje limitów w zapytaniach DELETE i UPDATE?

konto usunięte

Temat: [postgres] usuwanie zduplikowanych rekordów

Łukasz Bandzarewicz:
..swoją drogą, dlaczego postgres nie obsługuje limitów w zapytaniach DELETE i UPDATE?

Bo to nie zapytania :)
Monika A.

Monika A. programista

Temat: [postgres] usuwanie zduplikowanych rekordów

Tomasz Poradowski:
Krzysztof P.:
Tomasz Poradowski:
DELETE FROM table WHERE id IN (SELECT DISTINCT id FROM table GROUP BY id HAVING COUNT(*) > 1)
?

Ale to usunie wszystkie rekordy z zdublowanym ID. A pasowałoby jeden zostawić.
A, racja, na szybko pisałem ;), poprawka:

DELETE FROM table WHERE oid IN (SELECT MIN(oid) FROM table GROUP BY id HAVING COUNT(*) > 1)

przy założeniu, że tabela ma włączone OIDs (zamiast MIN można też wziąć MAX).

i przy założeniu, że jest tylko jeden duplikat :) (przynajmniej w Oracle tak to działa)
inaczej operację trzeba będzie powtarzać n-razy :)

może lepiej tak:

DELETE FROM nasza_tabela
WHERE EXISTS
(SELECT 1 FROM nasza_tabela A
WHERE
A.UNIKALNY_IDENTYFIKATOR = nasza_tabela.UNIKALNY_IDENTYFIKATOR and A.OID < nasza_tabela.OID);
Monika A.

Monika A. programista

Temat: [postgres] usuwanie zduplikowanych rekordów

Monika Helena Myszkiewicz:
Tomasz Poradowski:
Krzysztof P.:
Tomasz Poradowski:
DELETE FROM table WHERE id IN (SELECT DISTINCT id FROM table GROUP BY id HAVING COUNT(*) > 1)
?

Ale to usunie wszystkie rekordy z zdublowanym ID. A pasowałoby jeden zostawić.
A, racja, na szybko pisałem ;), poprawka:

DELETE FROM table WHERE oid IN (SELECT MIN(oid) FROM table GROUP BY id HAVING COUNT(*) > 1)

przy założeniu, że tabela ma włączone OIDs (zamiast MIN można też wziąć MAX).

i przy założeniu, że jest tylko jeden duplikat :) (przynajmniej w Oracle tak to działa)
inaczej operację trzeba będzie powtarzać n-razy :)

może lepiej tak:

DELETE FROM nasza_tabela
WHERE EXISTS
(SELECT 1 FROM nasza_tabela A
WHERE
A.UNIKALNY_IDENTYFIKATOR = nasza_tabela.UNIKALNY_IDENTYFIKATOR and A.OID < nasza_tabela.OID);


a jeśli już tak bardzo lubimy agregować:

DELETE FROM nasza_tabela WHERE oid NOT IN (SELECT Min(oid) FROM nasza_tabela GROUP BY unikalny_identyfikator);

konto usunięte

Temat: [postgres] usuwanie zduplikowanych rekordów

Monika Helena Myszkiewicz:
DELETE FROM nasza_tabela
WHERE EXISTS
(SELECT 1 FROM nasza_tabela A
WHERE
A.UNIKALNY_IDENTYFIKATOR = nasza_tabela.UNIKALNY_IDENTYFIKATOR and A.OID < nasza_tabela.OID);

Zdecydowanie najlepsze rozwiązanie, dodatkowo jeśli nie ma OID (bo np. jest to SQLite lub inny Access) to przepis ogólny jest prosty:

1. Dodać kolumnę porządkową.
2. Odpalić kasowanie wszystkiego wśród duplikatów co ma l. porządkową (mniejszą / większą - do wyboru) od (max / min - do wyboru).

A wygenerowanie liczby porządkowej? Trzeba by założyć nowy wątek :)

konto usunięte

Temat: [postgres] usuwanie zduplikowanych rekordów

Piotr Likus:
Monika Helena Myszkiewicz:
DELETE FROM nasza_tabela
WHERE EXISTS
(SELECT 1 FROM nasza_tabela A
WHERE
A.UNIKALNY_IDENTYFIKATOR = nasza_tabela.UNIKALNY_IDENTYFIKATOR and A.OID < nasza_tabela.OID);

Zdecydowanie najlepsze rozwiązanie, dodatkowo jeśli nie ma OID (bo np. jest to SQLite lub inny Access) to przepis ogólny jest prosty:

Jeśli chodzi o "zdecydowanie najlepsze" rozwiązania, to był bym bardzo ostrożny.. nie ma najlepszych rozwiązań ;)

W moim przypadku pomogło:
1/ stworzenie tymczasowej tabeli o strukturze identycznej z tabelą, z której chcemy pozbyć się duplikatów
2/ insert into tbl_temp (select distrinc * from tbl)
3/ usunięcie rekordów z tbl
4/ insert w odwrotną stronę: into tbl (select * from tbl_temp)
5/ założenie kluczy, indeksów, sekwencji
6/ usunięcie tabeli tymczasowej

gwoli ścisłości:
1/ zdublowane rekordy były IDENTYCZNE, łącznie z id rekordu
2/ chciałem usunąć DUPLIKATY oryginalnych rekordów

konto usunięte

Temat: [postgres] usuwanie zduplikowanych rekordów

Łukasz Bandzarewicz:
Piotr Likus:
Monika Helena Myszkiewicz:
DELETE FROM nasza_tabela
WHERE EXISTS
(SELECT 1 FROM nasza_tabela A
WHERE
A.UNIKALNY_IDENTYFIKATOR = nasza_tabela.UNIKALNY_IDENTYFIKATOR and A.OID < nasza_tabela.OID);

Zdecydowanie najlepsze rozwiązanie, dodatkowo jeśli nie ma OID (bo np. jest to SQLite lub inny Access) to przepis ogólny jest prosty:

Jeśli chodzi o "zdecydowanie najlepsze" rozwiązania, to był bym bardzo ostrożny.. nie ma najlepszych rozwiązań ;)

Są najlepsze - w ramach założeń :)
Chyba że założenia nie są określone.
Twoje rozwiązanie też jest dobre - nie wymaga zmóżdżania się nad SQL-em.

A ogólnie, przykład z początku wątku jest idealnym argumentem za wstawianiem w -każdej- tabeli PK technicznego (oid).Piotr Likus edytował(a) ten post dnia 07.08.08 o godzinie 11:09

konto usunięte

Temat: [postgres] usuwanie zduplikowanych rekordów

Piotr Likus:

A ogólnie, przykład z początku wątku jest idealnym argumentem za wstawianiem w -każdej- tabeli PK technicznego (oid)

To jest oczywiste.. ;)
Problem mój polegał na tym, że osoba, która wgrała backup bazy z jakiś bliżej mi nieznanych powodów zdjęła z tabeli PK i na domiar złego wgrała dwa razy te same dane :/
Mateusz Moździerz

Mateusz Moździerz Student, Uniwersytet
im. Adama
Mickiewicza w
Poznaniu

Temat: [postgres] usuwanie zduplikowanych rekordów

Tomasz Poradowski:
Łukasz Bandzarewicz:
Moja baza danych miała małą awarię, po wgraniu backup-u okazało się, że w jednej tabeli zostało zdjęte ograniczenie na primary key i co gorsza pojawiły się w niej zduplikowane rekordy..
Pytanie brzmi: jak usunąć redundantne dane?
Niestety postgres nie obsługuje zapytań w stylu: DELETE * FROM table WHERE id=1 LIMIT 1;
DELETE FROM table WHERE id IN (SELECT DISTINCT id FROM table GROUP BY id HAVING COUNT(*) > 1)
?

tak to jest jak się nie doczytuje reszty wątku - bezmyślnie skopiowałem tego deleta i wywaliłem wszystko eehhsshh ;)



Wyślij zaproszenie do