Mam tabelę bazy danych PostgreSQL o nazwie „user_links”, która obecnie pozwala na następujące zduplikowane pola:
year, user_id, sid, cid
Unikalna ograniczenie jest obecnie pierwsze pole o nazwie „id”, jednak jestem teraz chce dodać ograniczenie, aby upewnić się year
, user_id
, sid
a cid
wszystkie są wyjątkowe, ale nie mogę zastosować ograniczenia, ponieważ już istnieją zduplikowane wartości, które naruszają te ograniczenia.
Czy istnieje sposób na znalezienie wszystkich duplikatów?
Odpowiedzi:
Podstawową ideą będzie użycie zagnieżdżonego zapytania z agregacją liczby:
Możesz dostosować klauzulę where w wewnętrznym zapytaniu, aby zawęzić wyszukiwanie.
Istnieje inne dobre rozwiązanie tego wspomnianego w komentarzach (ale nie wszyscy je czytają):
Lub krócej:
źródło
select co1, col2, count(*) from tbl group by col1, col2 HAVING count(*)>1
Od „ Znajdź zduplikowane wiersze za pomocą PostgreSQL ” oto inteligentne rozwiązanie:
źródło
SELECT * FROM ( SELECT *, LEAD(row,1) OVER () AS nextrow FROM ( SELECT *, ROW_NUMBER() OVER(w) AS row FROM tbl WINDOW w AS (PARTITION BY col1, col2 ORDER BY col3) ) x ) y WHERE row > 1 OR nextrow > 1;
ROW_NUMBER()
zCOUNT(*)
, i dodaćrows between unbounded preceding and unbounded following
poORDER BY id asc
DELETE ...USING
i drobnych poprawekMożesz dołączyć do tej samej tabeli na polach, które zostałyby zduplikowane, a następnie anty-dołączyć na polu id. Wybierz pole id z pierwszego aliasu tabeli (tn1), a następnie użyj funkcji array_agg w polu id drugiego aliasu tabeli. Wreszcie, aby funkcja array_agg działała poprawnie, wyniki zostaną pogrupowane według pola tn1.id. Spowoduje to wygenerowanie zestawu wyników zawierającego identyfikator rekordu i tablicę wszystkich identyfikatorów pasujących do warunków łączenia.
Oczywiście identyfikatory, które będą w tablicy duplicate_entries dla jednego identyfikatora, również będą miały własne wpisy w zestawie wyników. Będziesz musiał użyć tego zestawu wyników, aby zdecydować, który identyfikator chcesz stać się źródłem „prawdy”. Jeden rekord, którego nie należy usuwać. Może mógłbyś zrobić coś takiego:
Wybiera najniższe numery identyfikatorów, które mają duplikaty (zakładając, że identyfikator zwiększa int PK). Byłyby to identyfikatory, które miałbyś przy sobie.
źródło
Aby to ułatwić, zakładam, że chcesz zastosować unikalne ograniczenie tylko dla roku kolumny, a kluczem podstawowym jest kolumna o nazwie id.
Aby znaleźć zduplikowane wartości, powinieneś uruchomić,
Używając powyższej instrukcji sql, otrzymujesz tabelę, która zawiera wszystkie zduplikowane lata w twojej tabeli. Aby usunąć wszystkie duplikaty oprócz najnowszej zduplikowanej pozycji , powinieneś użyć powyższej instrukcji sql.
źródło