Mam tabelę w bazie danych PostgreSQL 8.3.8, która nie ma kluczy / ograniczeń i ma wiele wierszy z dokładnie takimi samymi wartościami.
Chciałbym usunąć wszystkie duplikaty i zachować tylko 1 kopię każdego wiersza.
W szczególności istnieje jedna kolumna (zwana „kluczem”), której można użyć do identyfikacji duplikatów (tj. Powinien istnieć tylko jeden wpis dla każdego odrębnego „klucza”).
W jaki sposób mogę to zrobić? (najlepiej pojedynczym poleceniem SQL) Szybkość nie jest w tym przypadku problemem (jest tylko kilka wierszy).
sql
postgresql
duplicates
André Morujão
źródło
źródło
Szybszym rozwiązaniem jest
źródło
ctid
?To jest szybkie i zwięzłe:
Zobacz także moją odpowiedź w artykule Jak usunąć zduplikowane wiersze bez unikalnego identyfikatora, który zawiera więcej informacji.
źródło
ctid
wskazuje na fizyczną lokalizację rekordu w tabeli. W przeciwieństwie do tego, co napisałem wtedy w komentarzu, użycie operatora less than niekoniecznie wskazuje na starszą wersję, ponieważ ct może się zawijać, a wartość z niższym ctid może być w rzeczywistości nowsza.min(ctid)
? podczas gdy twoi zatrzymują nowsze? dzięki!Próbowałem tego:
dostarczone przez Postgres wiki:
https://wiki.postgresql.org/wiki/Deleting_duplicates
źródło
id
zawarte.id
której kolumna1 ... 3 jest zduplikowanaUżyłbym tabeli tymczasowej:
Następnie usuń
tab
i zmień nazwętab_temp
natab
.źródło
DROP TABLE IF EXISTS tmp; CREATE TABLE tmp as ( SELECT * from (SELECT DISTINCT * FROM your_table) as t ); DELETE from your_table; INSERT INTO your_table SELECT * from tmp; DROP TABLE tmp;
Musiałem stworzyć własną wersję. Wersja napisana przez @a_horse_with_no_name jest zdecydowanie za wolna na mojej tabeli (21 mln wierszy). @Rapimo po prostu nie usuwa dupków.
Oto, czego używam w PostgreSQL 9.5
źródło
Inne podejście (działa tylko wtedy, gdy masz jakieś unikalne pole, takie jak
id
w tabeli), aby znaleźć wszystkie unikalne identyfikatory według kolumn i usunąć inne identyfikatory, które nie znajdują się na liście unikatowychźródło
Co powiesz na:
Martwiłem się o wykonanie zlecenia, czy DELETE nastąpi przed SELECT DISTINCT, ale dla mnie działa dobrze. Dodatkową zaletą jest brak konieczności posiadania wiedzy na temat struktury tabeli.
źródło
json
), To nie zadziała.To działało dobrze dla mnie. Miałem tabelę, terminy, które zawierały zduplikowane wartości. Uruchomiono zapytanie w celu wypełnienia tabeli tymczasowej wszystkimi zduplikowanymi wierszami. Następnie uruchomiłem instrukcję delete z tymi identyfikatorami w tabeli tymczasowej. wartość to kolumna zawierająca duplikaty.
źródło
Oto rozwiązanie wykorzystujące
PARTITION BY
:źródło