Doppelte Einträge löschen
Doppelte Einträge löschen
am 21.09.2005 09:37:05 von Heiko Rittelmeier
Hallo!
Ich habe eine Datenbank übernommen, die doppelte Einträge enthält.
Faktisch ist nicht der ganze Eintrag doppelt, sondern nur relevante
Teile.
Es ist eine Adressdatenbank und ich bräuchte eine Abfrage, die alle
Datensätze löscht, deren "Name" und "Branche" gleich ist. Ich habe
versucht, die relevanten Datensätze mit einem SELECT DISTINCT heraus
zu holen, das scheiterte aber daran, dass DISTICT sich nur auf eine
Spalte zu beziehen scheint.
Auch Dr. Google brachte nichts verwertbares.
Hätte einer von Euch eine Lösung?
Danke!
Heiko
--
http://www.computerbetrug.de - Gegen Straftaten im Internet
http://www.dialerhilfe.de - Gegen unseriöse Dialer
Re: Doppelte Einträge löschen
am 21.09.2005 10:46:28 von Stefan Rybacki
Heiko Rittelmeier wrote:
> Hallo!
>
>
> Ich habe eine Datenbank übernommen, die doppelte Einträge enthält.
> Faktisch ist nicht der ganze Eintrag doppelt, sondern nur relevante
> Teile.
>
> Es ist eine Adressdatenbank und ich bräuchte eine Abfrage, die alle
> Datensätze löscht, deren "Name" und "Branche" gleich ist. Ich habe
> versucht, die relevanten Datensätze mit einem SELECT DISTINCT heraus
> zu holen, das scheiterte aber daran, dass DISTICT sich nur auf eine
> Spalte zu beziehen scheint.
Nein, Distinct arbeit auf allen im Select angegebenen Attributen.
Also
SELECT DISTINCT name, branche FROM table liefert dir genau die Doppelten.
allerdings willst du das nicht so.
du willst eher sowas:
DELETE FROM table WHERE id IN (SELECT a.id FROM table a JOIN table b USING (name, branche)
WHERE a.id
(ungetestet)
Bis denn dann
Stefan
>
> Auch Dr. Google brachte nichts verwertbares.
>
> Hätte einer von Euch eine Lösung?
>
>
>
> Danke!
>
>
>
> Heiko
Re: Doppelte Einträge löschen
am 21.09.2005 11:01:07 von Heiko Rittelmeier
Am Wed, 21 Sep 2005 10:46:28 +0200 schrieb Stefan Rybacki
:
>Heiko Rittelmeier wrote:
>> Hallo!
>>
>>
>> Ich habe eine Datenbank übernommen, die doppelte Einträge enthält.
>> Faktisch ist nicht der ganze Eintrag doppelt, sondern nur relevante
>> Teile.
>>
>> Es ist eine Adressdatenbank und ich bräuchte eine Abfrage, die alle
>> Datensätze löscht, deren "Name" und "Branche" gleich ist. Ich habe
>> versucht, die relevanten Datensätze mit einem SELECT DISTINCT heraus
>> zu holen, das scheiterte aber daran, dass DISTICT sich nur auf eine
>> Spalte zu beziehen scheint.
>
>Nein, Distinct arbeit auf allen im Select angegebenen Attributen.
>
>Also
>SELECT DISTINCT name, branche FROM table liefert dir genau die Doppelten.
>
>allerdings willst du das nicht so.
>
Wenn es eine Möglichkeit gibt zu sagen "Nehme alle, die bis auf die ID
identisch sind" dann will ich das schon.
Das SELECT DISTINCT * scheitert nämlich daran, dass die IDs nicht
identisch sind, sondern nur die Textfelder.
Viele Grüße,
Heiko
--
http://www.computerbetrug.de - Gegen Straftaten im Internet
http://www.dialerhilfe.de - Gegen unseriöse Dialer
Re: Doppelte Einträge löschen
am 21.09.2005 11:15:07 von Kai Ruhnau
Heiko Rittelmeier wrote:
> Es ist eine Adressdatenbank und ich bräuchte eine Abfrage, die alle
> Datensätze löscht, deren "Name" und "Branche" gleich ist. Ich habe
> versucht, die relevanten Datensätze mit einem SELECT DISTINCT heraus
> zu holen, das scheiterte aber daran, dass DISTICT sich nur auf eine
> Spalte zu beziehen scheint.
Zunächsteinmal gehe ich davon aus, dass du nicht alle doppelten löschen
willst, sondern alle bis auf einen.
Leider unterstützt MySQL nicht das gleichzeitige SELECTen und verändern
(DELETE) von Datensätzen innerhalb einer einzelnen Abfrage, also musst
du den Umweg über eine Temporäre Tabelle oder eine Anwendung gehen.
Für alle doppelten Datensätze bis auf einen benutzt du dann in etwa
folgendes SELECT, wobei der Datensatz mit der kleinsten ID nicht
zurückgegeben wird.
SELECT DISTINCT a.ID
FROM tabelle AS a
LEFT JOIN tabelle AS b ON b.Name=a.Name
AND b.Branche=a.Brance
AND b.ID>a.ID
WHERE b.ID IS NOT NULL
Aber:
- vorher testen
- Backup nicht vergessen
Den Rest überlasse ich zur Übung :-)
Grüße
Kai
Re: Doppelte Einträge löschen
am 21.09.2005 11:19:41 von Stefan Rybacki
Heiko Rittelmeier wrote:
> Am Wed, 21 Sep 2005 10:46:28 +0200 schrieb Stefan Rybacki
> :
>
>
>>Heiko Rittelmeier wrote:
>>
>>>Hallo!
>>>
>>>
>>>Ich habe eine Datenbank übernommen, die doppelte Einträge enthält.
>>>Faktisch ist nicht der ganze Eintrag doppelt, sondern nur relevante
>>>Teile.
>>>
>>>Es ist eine Adressdatenbank und ich bräuchte eine Abfrage, die alle
>>>Datensätze löscht, deren "Name" und "Branche" gleich ist. Ich habe
>>>versucht, die relevanten Datensätze mit einem SELECT DISTINCT heraus
>>>zu holen, das scheiterte aber daran, dass DISTICT sich nur auf eine
>>>Spalte zu beziehen scheint.
>>
>>Nein, Distinct arbeit auf allen im Select angegebenen Attributen.
>>
>>Also
>>SELECT DISTINCT name, branche FROM table liefert dir genau die Doppelten.
>>
>>allerdings willst du das nicht so.
>>
>
>
> Wenn es eine Möglichkeit gibt zu sagen "Nehme alle, die bis auf die ID
> identisch sind" dann will ich das schon.
>
> Das SELECT DISTINCT * scheitert nämlich daran, dass die IDs nicht
> identisch sind, sondern nur die Textfelder.
>
Richtig. Was ich meinte, war daß du die Lösung nicht möchtest, weil du die Einträge nicht
identifizieren kannst, d.h. du hast die ID trotzdem nicht und das hilft dir nicht weiter.
Desweiteren bekommst du auch die angezeigt, die nicht doppelt sind.
Bis denn dann
Stefan
>
> Viele Grüße,
>
>
>
> Heiko
Re: Doppelte Einträge löschen
am 21.09.2005 12:13:58 von newsgroup
"Heiko Rittelmeier"
schrieb im Newsbeitrag
news:21092005.093705.dcdm.$hr-nb$.1701@shavenaar.crisu.de...
> Hallo!
>
>
> Ich habe eine Datenbank übernommen, die doppelte Einträge enthält.
> Faktisch ist nicht der ganze Eintrag doppelt, sondern nur relevante
> Teile.
>
> Es ist eine Adressdatenbank und ich bräuchte eine Abfrage, die alle
> Datensätze löscht, deren "Name" und "Branche" gleich ist. Ich habe
> versucht, die relevanten Datensätze mit einem SELECT DISTINCT heraus
> zu holen, das scheiterte aber daran, dass DISTICT sich nur auf eine
> Spalte zu beziehen scheint.
>
> Auch Dr. Google brachte nichts verwertbares.
>
> Hätte einer von Euch eine Lösung?
delete from tabelle t1
where exists ( select 1 from tabelle t2 where t1.name = t2.name
and t1.branche =
t2.branche
and
anderen doppelten Spalten>
and t1.id >
t2.id )
Das löscht alle Zeilen, die eine Duplette mit kleinerer ID haben. Das
heisst, von
allen Dupletten bleibt jeweils die mit der kleinsten ID zurück.
Gruß,
Michael
Re: Doppelte Einträge löschen
am 21.09.2005 12:50:13 von Kai Ruhnau
Michael König wrote:
> "Heiko Rittelmeier"
schrieb im Newsbeitrag
> news:21092005.093705.dcdm.$hr-nb$.1701@shavenaar.crisu.de...
Zu lang. Es heißt Einleitungs_zeile_
>>Es ist eine Adressdatenbank und ich bräuchte eine Abfrage, die alle
>>Datensätze löscht, deren "Name" und "Branche" gleich ist. Ich habe
>>versucht, die relevanten Datensätze mit einem SELECT DISTINCT heraus
>>zu holen, das scheiterte aber daran, dass DISTICT sich nur auf eine
>>Spalte zu beziehen scheint.
[snip]
> delete from tabelle t1
> where exists ( select 1 from tabelle t2 where t1.name = t2.name
> and t1.branche =
> t2.branche
> and
> anderen doppelten Spalten>
> and t1.id >
> t2.id )
http://dev.mysql.com/doc/mysql/en/delete.html
Ganz unten:
"Currently, you cannot delete from a table and select from the same
table in a subquery."
Grüße
Kai
Re: Doppelte Einträge löschen
am 24.09.2005 12:32:42 von Stephan Weissenrieder
Heiko Rittelmeier
writes:
> Hallo!
>
> Ich habe eine Datenbank übernommen, die doppelte Einträge enthält.
> Faktisch ist nicht der ganze Eintrag doppelt, sondern nur relevante
> Teile.
>
> Es ist eine Adressdatenbank und ich bräuchte eine Abfrage, die alle
> Datensätze löscht, deren "Name" und "Branche" gleich ist.
(Temporär) einen uniq index auf die 2 Spalten legen. Löscht aber
natürlich nicht alle sondern lässt jeweils einen Eintrag in der DB.
ALTER IGNORE TABLE eins ADD UNIQUE INDEX temp_index (id , id2) ;
Query OK, 4 rows affected (0.03 sec)
Records: 4 Duplicates: 1 Warnings: 0
HTH
Stephan