2013-01-31 13 views
5

Powiel możliwe:
How to delete duplicate rows with SQL?Jak usunąć duplikaty rekordów w sql

Mam tabeli z rekordami i chcę usunąć wszystkie duplikaty rekordów

DELETE FROM 'table' 
WHERE 'field' IN 
(
SELECT 'field' FROM 'table' GROUP BY 'field' 
HAVING (COUNT('field')>1) 
) 

Dlaczego czy to nie działa?

+0

Czy pojawił się komunikat o błędzie lub czy zapytanie zostało pomyślnie uruchomione? –

+1

Czy Twoje zapytanie nie usunie wszystkich pól, w tym duplikatów? jeśli masz 2 duplikaty z tym identyfikatorem, twoje zapytanie IN() usunie oba. Nie chcesz zachować przynajmniej jednego rekordu? – GGio

+2

mysql nie pozwala aktualizować/usuwać w tabeli, z której wybierasz dane. –

Odpowiedz

5

Może możesz eksplorować za pomocą polecenia DISTINCT, aby wybrać tylko unikalne rekordy oparte w polu.

Możesz utworzyć nową tabelę z unikalnymi wpisami. Jako przykład ...

CREATE TABLE nonDuplicates 
SELECT DISTINCT * FROM yourTable group by field 
+1

To będzie działać tylko dlatego, że obsługa MySQL GROUP BY jest w zasadzie niepoprawna i dopuszcza tę nieważną składnię. Ale to najprawdopodobniej najszybsze rozwiązanie. –

+0

Dziękuję, Peixe, zadziałało dobrze! – vdhmartijn

+1

@vdhmartijn: przeczytaj ten http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html, aby zrozumieć, * dlaczego * działa w MySQL i dlaczego inne DBMS odrzuci takie stwierdzenie jako nieważny. –

1

To daje więcej niż jeden wynik: -

SELECT field FROM `table` 
GROUP BY field 
HAVING (COUNT('field)>1 

Spróbuj chenge to poprzez:

SELECT TOP 1 field 
FROM `table` 
GROUP BY field 
HAVING (COUNT(field)>1 
+0

SELECT TOP 1 nie działa dla mnie .. nadal nie działa – vdhmartijn

+0

Jak to usunąć cokolwiek? –

0

Pierwszy uzyskać wszystkie duplikaty i przechowywać je w tablicy.

SELECT field 
FROM `table` 
GROUP BY field 
HAVING COUNT('field') > 1 

teraz zrobić php aby zapisać jeden wynik cokolwiek chcesz, a następnie wykonać

DELETE 
FROM `table` 
WHERE field IN (your values) AND field != savedID 
+0

Dziękuję za reakcję, ale moim zamiarem jest praca bez PHP tylko SQL – vdhmartijn

0

MySQL ma bardzo nieprzyjemny ograniczenie, które nie mogą korzystać z tabeli, która jest aktualizowana/usunięte/włożoną w sub -Wybierz.

Można jednak obejść ten problem, dołączając do tabeli, która ma zostać usunięta (zamiast korzystać z opcji podrzędnej).

Zakładając masz jakieś unikalnego identyfikatora w tabeli (zakładam kolumnę id w następującym oświadczeniem):

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
    SELECT min(id) as min_id, field 
    FROM table_with_duplicates 
    GROUP BY field 
) keep ON keep.field = d.field 
     AND keep.min_id <> d.id; 

to zachowa jeden wiersz dla każdej z dwóch egzemplarzach (jeden z Lowes wartość w kolumnie id).

Jeśli chcesz usunąć wszystkie duplikaty wierszy (nie przechowuje co najmniej jednego), po prostu usuń warunek AND keep.min_id <> d.id.

Edit

Jeśli nie masz niepowtarzalną kolumnę, ale chcesz usunąć wszystkie duplikaty (nie utrzymanie co najmniej jednego rzędu), a następnie można użyć:

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
    SELECT field 
    FROM table_with_duplicates 
    GROUP BY field 
    HAVING count(*) > 1 
) del ON del.field = d.field; 
+0

A jeśli nie mam identyfikatora, czy nadal istnieje sposób na rozwiązanie tego problemu? – vdhmartijn

+0

@vdhmartijn: Jeśli chcesz usunąć ** wszystkie ** duplikaty (nie zatrzymując co najmniej jednego), możesz zrobić to bez ID. W przeciwnym razie zobacz odpowiedź peixe. –

+0

dzięki za pomoc, działa już teraz! – vdhmartijn

Powiązane problemy