SQL Doppelte Einträge Löschen

Murphy9904

Lt. Junior Grade
Registriert
Mai 2007
Beiträge
344
Hi,
also ich hab ne Tabelle die schaut ca so aus:

ID wert1 wert 2
1 lala xd
2 lala xd
3 buuuh irgendwas
4 lslsl blabla

so und jetzt möchte ich dass eins von den "lala" dingern rausgelöscht wird.. also das jeder wert nur einmal vorkommt
mit dieser abfrage kann ich zumindest die doppelten Werte ausfindig machen, aber weiter komm ich nich :(
Code:
SELECT [wert1] ,[wert2], count(*)
   FROM [lalala].[dbo].[irgendwas]
   group by [wert1] ,[wert2]
   having count(*) > 1
 
Zuletzt bearbeitet:
delete from tabelle where wert1 not in (select wert1 from tabelle group by wert 2)

normal gruppiert er dir jetzt einfach alle einträge - bei dopppelten nimmt er für wert1 den ersten wert den er findet (1 ODER 2) und dann löscht er alle anderen.

grüsse ;)
 
delete
from tabelle
where id in (select TOP 1 "Abfrage welche doppelte ausspuckt")

Löscht das erste Duplikat, das ganze dann noch in eine Schleife (while rowcount<>0)
Bei der Schleifensyntax bin ich aber nicht fit.
 
hmm,
Jetzt hab ich 2 Lösungen und ich bekomm keines von beiden zum Laufen :D

also beim ersten kann ich ja nicht nach wert2 gruppieren weil ja nur wert1 in der liste ist.?

und beim 2. hab ichs jetzt so:
Code:
delete
from [lalala].[dbo].[irgendwas]
where id in (select top 1 * (SELECT [wert1] ,[wert2,count(*)
   FROM [lalala].[dbo].[irgendwas]   
   group by [wert1],[wert2]
   having count(*) > 1))
ist aber auch nicht das wahre weils nich funktioniert :(
 
Versuche mal das:

delete
from tabelle
where id in ( select top 1 id from tabelle inner join (select wert1,wert2 from tabelle group by wert1,wert2 having count(*) > 1 ) as list on tabelle.wert1=list.wert1 and tabelle.wert2=list.wert2)

Der Ansatz funktioniert auf jeden Fall, steht in einem meiner alten scripte so. Frage mich selbst warum das nicht einfacher geht ?
 
Zuletzt bearbeitet:
das klingt ja auch ganz nett aber da sagt er ganz faul "(0 row(s) affected)"
 
Keine doppelten? Habe es eben auf einer Tabelle ID,WERT1,WERT2 getestet. Löscht mir den doppelten, beim 2. Ausführen nichts mehr. Die Syntax ist also auch richtig.
Hast du keine doppelten :-) ?
 
doch ja eben schon, die bleiben auch nach dem Ausführen immernoch
ich bin dann mal weg, beschäftige mich morgen wieder damit.
Ergänzung ()

Ich hab jetzt herrausgefunden woran es lag XD
Ich hab die Tabelle aus einer CSV Datei Importiert und die ID nicht automatisch erstellen lassen, und hab jetzt ganz sorglos paar extra werte Ohne ID eingetragen :D
und diese konnte er nicht löschen

Jetzt gehts - danke :)
 
delete from tablelle where wert1 not in (select distinct wert1 from tabelle)

Das müsste auch einfach gehen - select distinct liefert dir den ersten eintrag den er findet und nicht mehr...

grüsse!
 
aber ich muss das ja auf 2 werte beziehen und das bekomm ich nciht hin
 
wieso, wenn es noch 1,2,3,4,5,6,7,8,9,x weitere gibt mit dem selben wert (wert1) dann selektiert er die nicht. Das heisst er löscht immer alle ausser einem.... =)


edit.: seh grade dass ich da was übersehen hab! moment *denken*
Ergänzung ()

Also ich hab jetzt ziemlich rumprobiert, und hab dann mal im netz gesucht und selbst microsoft schlägt vor es über eine tempüoräre tabelle zu machen.

http://www.databasejournal.com/feat...leting-Duplicate-Rows-in-a-MySQL-Database.htm

einfach nach delete duplicate sql suchen dann findest noch mehr dazu.
 
Cool danke,
aber ich werd aus den meisten nicht ganz schlau draus. die sind ja nur für einen Eintrag.

Die Lösung muss ja nicht die beste sein, ich kann ja das Script vom keren so oft ausführen bis keine Doppelten mehr über sind. ;)
 
Nochmal zur Schleife, war gestern wohl nicht auf der höhe. Die Abfrage einmal ausführen um rowcount zu setzten (Wert der letzten Abfrage) und dann in eine While Schleife packen.

Delete from tabelle .........

WHILE (@@rowcount>0)
BEGIN

delete from tabelle .......

END
 
cool super das klappt :)

Danke!!!
 
Ich hätte das so gemacht:
Code:
DELETE FROM T1
WHERE S1 NOT IN 
	(SELECT min(S1) 
	FROM T1 Tab1 
	GROUP BY S2)

T1 = Die Tabelle
S1 = Die ID
S2 = Die Spalte, in der doppelte werte vorkommen.

Resultat: Es bleibt von jedem unterschiedlichen S2 nur die Zeile mit dem niedrigsten S1 übrig.

Ganz ohne temporäre Tabellen, Prozeduren oder sonstige Hexerei.

Funktioniert natürlich nur, solange sich die Zeilen zumindest im S1-Wert unterscheiden.
 
aber das Problem war ja dass die Id das einzigste ist was "einmalig" ist.
wir haben ja 3 spalten. ID , Wert1 , Wert2
 
Ja dann musst du in dem Statement einfach nur alle "nicht einmaligen" Spalten im Group By angeben.
Damit bekommst du für jede Menge von Datensätzen, die im Inhalt des "Group By" identisch sind, jeweils alle gelöscht, die nicht die niedrigste ID(S1) in der jeweiligen Gruppe haben.

Führ das Subselect mal alleine aus. Was du dort als Rückgabewerte bekommst, sind die einzigen IDs, die übrigbleiben.

für dich also:
Code:
DELETE FROM Tabelle WHERE ID NOT IN (SELECT MIN(ID) FROM Tabelle GROUP BY Wert1,Wert2)
 
stimmt klappt ja tatsächlich ;)
is ja viel cooler geschrieben

hätt grad nich geglaubt das das geht.. man lernt immer dazu :D
 
Zurück
Oben