Mam bazę danych SQL Server organizacji i istnieje wiele zduplikowanych wierszy. Chcę uruchomić instrukcję select, aby pobrać wszystkie te i liczbę kopii, ale także zwrócić identyfikatory powiązane z każdą organizacją.
Oświadczenie takie jak:
SELECT orgName, COUNT(*) AS dupes
FROM organizations
GROUP BY orgName
HAVING (COUNT(*) > 1)
Zwróci coś takiego
orgName | dupes
ABC Corp | 7
Foo Federation | 5
Widget Company | 2
Ale chciałbym też zdobyć ich identyfikatory. Czy jest na to sposób? Może jak
orgName | dupeCount | id
ABC Corp | 1 | 34
ABC Corp | 2 | 5
...
Widget Company | 1 | 10
Widget Company | 2 | 2
Powodem jest to, że istnieje osobna tabela użytkowników, którzy prowadzą do tych organizacji, i chciałbym je ujednolicić (dlatego usuwaj duplikaty, aby użytkownicy linkowali do tej samej organizacji zamiast dupe org). Ale chciałbym rozdzielić ręcznie, aby niczego nie schrzanić, ale nadal potrzebowałbym instrukcji zwracającej identyfikatory wszystkich duplikowanych organizacji, aby móc przeglądać listę użytkowników.
źródło
isnull()
dla zerowalnych kolumn won
sekcjiMożesz uruchomić następujące zapytanie, znaleźć duplikaty
max(id)
i usunąć te wiersze.Ale będziesz musiał uruchomić to zapytanie kilka razy.
źródło
MAX( COUNT(*) ) - 1
razy, co może być nadal wykonalne.Możesz to zrobić w następujący sposób:
Jeśli chcesz zwrócić tylko rekordy, które można usunąć (pozostawiając po jednym z nich), możesz użyć:
Edycja: SQL Server 2000 nie ma funkcji ROW_NUMBER (). Zamiast tego możesz użyć:
źródło
Rozwiązanie oznaczone jako poprawne nie działało dla mnie, ale znalazłem odpowiedź, która zadziałała świetnie: Uzyskaj listę zduplikowanych wierszy w MySql
źródło
n1.id > n2.id
zapobiegnie dwukrotnemu wyświetlaniu się każdej pary.Możesz tego spróbować, najlepiej dla Ciebie
źródło
Jeśli chcesz usunąć duplikaty:
źródło
Aby znaleźć duplikat rekordu 1) Za pomocą CTE
2) Korzystając z GroupBy
źródło
Więc rekordy z rowum> 1 będą duplikatami w twojej tabeli. „Podział według” najpierw pogrupuj według rekordów, a następnie serializuj je, nadając im numery seryjne. Więc rownum> 1 będzie zduplikowanymi rekordami, które można usunąć jako takie.
źródło
Src: https://stackoverflow.com/a/59242/1465252
źródło
źródło
źródło
Masz kilka sposobów na Select
duplicate rows
.dla moich rozwiązań, na przykład weźmy tę tabelę na przykład
Pierwsze rozwiązanie:
Drugie rozwiązanie: użyj
identity
polai na końcu wszystkich rozwiązań użyj tego polecenia
źródło
myślę, że wiem, czego potrzebowałem, aby wymieszać odpowiedzi i myślę, że mam rozwiązanie, którego chciał:
Posiadanie maksymalnego identyfikatora daje identyfikator duplikatu i oryginału, o co prosił:
jedyną smutną rzeczą, którą masz w tej formie
mam nadzieję, że to nadal pomaga
źródło
Załóżmy, że mamy tabelę „Student” z 2 kolumnami:
student_id int
student_name varchar
Teraz chcemy zobaczyć zduplikowane rekordy Użyj tego zapytania:
źródło
Mam lepszą opcję uzyskania duplikatów rekordów w tabeli
Wynik powyższego zapytania pokazuje wszystkie zduplikowane nazwy z unikalnymi identyfikatorami studentów i liczbą zduplikowanych wystąpień
Kliknij tutaj, aby zobaczyć wynik sql
źródło
źródło
Używam dwóch metod, aby znaleźć zduplikowane wiersze. Pierwsza metoda jest najbardziej znaną metodą grupowania według. Druga metoda wykorzystuje CTE - Common Table Expression .
Jak wspomniano w @RedFilter, ten sposób jest również odpowiedni. Wiele razy uważam, że metoda CTE jest również dla mnie przydatna.
W powyższym przykładzie zebraliśmy wynik, znajdując powtarzające się wystąpienie za pomocą ROW_NUMBER i PARTITION BY. Następnie zastosowaliśmy klauzulę where, aby wybrać tylko wiersze, które są powtarzane licząc więcej niż 1. Cały wynik jest gromadzony w tabeli CTE i łączony z tabelą Organizacje.
Źródło: CodoBee
źródło
Próbować
źródło