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