2009-08-17 11 views

Odpowiedz

26

Zobacz następujące pytanie: Deleting duplicate rows from a table.

Dostosowany akceptowane odpowiedź stamtąd (co jest moją odpowiedź, więc nie „kradzież” tutaj ...):

Można to zrobić w prosty sposób, przy założeniu, że masz wyjątkową pole ID: można usunąć wszystkie rekordy, które są takie same, z wyjątkiem identyfikatora, ale nie mają "minimalnego identyfikatora" dla swojej nazwy.

Przykład zapytania:

DELETE FROM members 
WHERE ID NOT IN 
(
    SELECT MIN(ID) 
    FROM members 
    GROUP BY name 
) 

w przypadku, gdy nie ma unikatowy indeks, moja rada jest taka, aby po prostu dodać unikatowy indeks autoinkrementowalny. Głównie dlatego, że jest to dobry projekt, ale także dlatego, że pozwoli ci uruchomić powyższe zapytanie.

+1

Oto, jak rozumiem powyższe: dla każdej nazwy grupuje je (tylko jeden, jeśli jest unikalny, kilka w jednym, jeśli duplikaty), wybiera najmniejszy identyfikator z zestawu, a następnie usuwa dowolny wiersz, którego identyfikator nie istnieje w tabeli . Brilliant :) Dziękuję bardzo Rax. – Gulbahar

+0

Dostałeś to dokładnie :) –

+1

w mysql Podczas wysyłania tego zapytania pojawia się następujący błąd: "" błąd 1093 (HY000), ale daje on błąd "Nie możesz podać docelowej tabeli" członków dla aktualizacji w klauzuli FROM "' żadnych pomysłów ? –

4

Prawdopodobnie łatwiej byłoby wybrać unikalne z nich w nowej tabeli, upuścić starą tabelę, a następnie zmienić nazwę tabeli tymczasowej, aby ją zastąpić.

#create a table with same schema as members 
CREATE TABLE tmp (...); 

#insert the unique records 
INSERT INTO tmp SELECT * FROM members GROUP BY name; 

#swap it in 
RENAME TABLE members TO members_old, tmp TO members; 

#drop the old one 
DROP TABLE members_old; 
+0

Dzięki Paul. Dla zainteresowanych ... Stwórz tabelę TEMP tmp_members (nazwa VARCHAR); INSERT INTO tmp_members WYBIERZ nazwę od członków GROUP BY nazwa; SELECT COUNT (name) FROM tmp_members; USUŃ OD członków; Członków VACUUM; SELECT COUNT (name) FROM members; INSERT INTO members (name) SELECT * FROM tmp_members; SELECT COUNT (name) FROM members; SELECT DISTINCT COUNT (name) FROM members; WYBIERZ nazwę od członków LIMIT 10; STADA DROP tmp_members; – Gulbahar

+0

Przepraszam, brakowało mi, że używasz SQLite! –

0

Mamy ogromną bazę danych, w której usuwanie duplikatów jest częścią regularnego procesu konserwacji. Używamy DISTINCT, aby wybrać unikalne rekordy, a następnie zapisać je w TYMCZASOWYM TABELI. Po TRUNCATE zapisujemy dane TYMCZASOWE w TABELI.

Jest to jeden ze sposobów robienia tego i działa jako ZAPISANA PROCEDURA.

+1

Muszę przyznać, że odpowiedź Raxa Olguda jest znacznie bardziej wyrafinowana i prawdopodobnie działa 100 razy szybciej! :) - Zastanawiam się nad przyjęciem rozwiązania ... Zasługuje na +1! –

0

Jeśli chcemy najpierw zobaczyć, które wiersze mają zostać usunięte. Następnie usuń je.

with MYCTE as (
    SELECT DuplicateKey1 
     ,DuplicateKey2 --optional 
     ,count(*) X 
    FROM MyTable 
    group by DuplicateKey1, DuplicateKey2 
    having count(*) > 1 
) 
SELECT E.* 
FROM MyTable E 
JOIN MYCTE cte 
ON E.DuplicateKey1=cte.DuplicateKey1 
    AND E.DuplicateKey2=cte.DuplicateKey2 
ORDER BY E.DuplicateKey1, E.DuplicateKey2, CreatedAt 

Pełny przykład w http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/

0

usunąć dup rząd zachować jeden tabela zawiera zduplikowane wiersze i może być kilka rzędów nie mają zduplikowane wiersze to zachować jeden wierszy, jeśli masz duplikat lub pojedyncze w tabeli. Tabela ma dwie kolumny id i nazwę, jeśli musimy usunąć zduplikowaną nazwę z tabeli i zachować jedną. Jego praca w porządku na moim końcu Musisz użyć tego zapytania.

DELETE FROM tablename 
WHERE id NOT IN(

SELECT id FROM 
(
    SELECT MIN(id)AS id 
    FROM tablename 
    GROUP BY name HAVING 
    COUNT(*) > 1 
)AS a) 
AND id NOT IN(
(SELECT ids FROM 
(
SELECT MIN(id)AS ids 
    FROM tablename 
    GROUP BY name HAVING 
    COUNT(*) =1 
)AS a1 
) 
) 

przed usunięciem tabela poniżej zobaczyć zrzut ekranu: enter image description here po usuwania tabeli poniżej zobaczyć zrzut ekranu tej kwerendy usunąć Amit i Akhil zduplikowane wiersze i zachować jeden rekord (Amit i Akhil):

enter image description here

0

można dołączyć tabelę z siebie dopasowane przez pola i usuń unmatching rzędy

DELETE t1 FROM table_name t1 
LEFT JOIN tablename t2 ON t1.match_field = t2.match_field 
WHERE t1.id <> t2.id; 
Powiązane problemy