Testuję coś w Oracle i zapełniłem tabelę przykładowymi danymi, ale w trakcie tego procesu przypadkowo załadowałem zduplikowane rekordy, więc teraz nie mogę utworzyć klucza podstawowego za pomocą niektórych kolumn.
Jak mogę usunąć wszystkie zduplikowane wiersze i zostawić tylko jeden z nich?
sql
oracle
duplicates
delete-row
juan
źródło
źródło
Od Zapytaj Toma
(poprawiono brakujący nawias)
źródło
Z DevX.com :
Gdzie kolumna1, kolumna2 itd. To klucz, którego chcesz użyć.
źródło
źródło
Rozwiązanie 1)
Rozwiązanie 2)
Rozwiązanie 3)
źródło
utwórz tabelę t2 jako wybierz odrębną * od t1;
źródło
distinct *
weźmie każdy rekord różniący się co najmniej 1 symbolem w 1 kolumnie. Wszystko, czego potrzebujesz, to wybrać odrębne wartości tylko z kolumn, które chcesz utworzyć jako klucze podstawowe - odpowiedź Billa jest doskonałym przykładem tego podejścia.Powinieneś zrobić mały blok pl / sql używając kursora dla pętli i usunąć wiersze, których nie chcesz zachować. Na przykład:
źródło
Aby wybrać duplikaty, tylko format zapytania może być:
Tak więc prawidłowe zapytanie zgodnie z inną sugestią to:
To zapytanie zachowa najstarszy rekord w bazie danych dla kryteriów wybranych w
WHERE CLAUSE
.Oracle Certified Associate (2008)
źródło
Najszybszy sposób na naprawdę duże stoły
Utwórz tabelę wyjątków ze strukturą poniżej: exceptions_table
Spróbuj utworzyć unikalne ograniczenie lub klucz podstawowy, który zostanie naruszony przez duplikaty. Otrzymasz komunikat o błędzie, ponieważ masz duplikaty. Tabela wyjątków będzie zawierała identyfikatory wierszy dla zduplikowanych wierszy.
Dołącz do swojej tabeli z zastosowaniem exceptions_table przez rowid i usuń dups
Jeśli liczba wierszy do usunięcia jest duża, utwórz nową tabelę (ze wszystkimi przydziałami i indeksami), zapobiegając łączeniu za pomocą wyjątków_tabeli według identyfikatora wiersza i zmień nazwę pierwotnej tabeli na oryginalną tabelę i zmień nazwę nowej_tabeli_with_no_dups na oryginalną tabelę
źródło
Korzystanie z rowid-
Korzystanie z samodzielnego łączenia
źródło
Rozwiązanie 4)
źródło
1. rozwiązanie
2. sloution
3. rozwiązanie
4. rozwiązanie
źródło
5. rozwiązanie
źródło
możesz też usunąć zduplikowane rekordy w inny sposób
źródło
źródło
źródło
źródło
Aby uzyskać najlepszą wydajność, oto co napisałem:
(zobacz plan wykonania)
źródło
Sprawdź poniższe skrypty -
1.
2.
3.
Zobaczysz tutaj 6-rekordów.
4. uruchom poniższe zapytanie -
select * from test;
Zobaczysz, że zduplikowane rekordy zostały usunięte.
Mam nadzieję, że to rozwiąże Twoje pytanie. Dzięki :)
źródło
Nie widziałem żadnych odpowiedzi, które używają typowych wyrażeń tabelowych i funkcji okien. To jest to, z czym najłatwiej mi się pracuje.
Coś do zapamiętania:
1) Sprawdzamy tylko pod kątem duplikacji pól w klauzuli partycji.
2) Jeśli masz jakiś powód, aby wybrać jeden duplikat zamiast innych, możesz użyć klauzuli order by, aby ten wiersz miał row_number () = 1
3) Możesz zmienić zachowany duplikat numeru, zmieniając ostatnią klauzulę where na „Where RN> N” z N> = 1 (myślałem, że N = 0 usunie wszystkie wiersze, które mają duplikaty, ale po prostu usunie wszystkie wiersze) .
4) Dodano pole Suma partycji, zapytanie CTE, które oznaczy każdy wiersz liczbą wierszy w grupie. Aby więc wybrać wiersze z duplikatami, w tym pierwszy element, użyj opcji „WHERE cnt> 1”.
źródło
źródło
rozwiązanie :
źródło