SQL Doppelte Einträge

Helios co.

Lt. Commander
Registriert
März 2005
Beiträge
1.863
Hallo,

ichhabe folgendes Tabellenschema: (id, wörter).

Jetzt kann es sein, dass viele wörter doppelt vorkommen. Ich möchte eine Query, die doppelte Wörter rausfiltert. D.h. In der Ergebnismenge darf es keine Duplikate mehr geben.

Probiert hatte ich folgendes:

Code:
SELECT * FROM Help2 WHERE (term) IN (SELECT term FROM Help2 GROUP BY term HAVING COUNT(*)<2);

Das Ding liefert mir aber nur all die Wörter (Terme) die lediglich ein einziges Mal vorkommen. Diejenigen die doppelt vorkommen, kommen ja nicht in diese Liste (oder sehe ich das falsch?).

Bin dankbar für jede Hilfe!
 
Wie wär's mit 'select distinct'... Sollte genau das machen was Du willst: mehrfach Vorkommendes wird nur einmal selektiert, alle anderen Daten (die nur einfach vorhanden sind) kommen wie bisher... Durch das 'distinct' kannst Du Dir auch den hässlichen 'having' Ausdruck sparen...
 
Das mit distinct geht aber nur, wenn du die ID nicht brauchst. Wenn du die ID haben willst, ist die Frage: welche? Zum Beispiel könnte man die niedrigste nehmen:

Code:
SELECT min(id), term FROM Help2 GROUP BY term

Sonst eben wie gesagt:
Code:
SELECT DISTINCT term FROM Help2
 
Vielen vielen Dank für die schnellen Antworten!

Distinct funzt prima!
 
ich würd aber mal überlegen ob du wirklich doppelte einträge brauchst, wenn die tablle wirlich nur id und wort umfasst.
 
Brauchen tue ich sie ja eben nicht. Das Problem ist, dass sich Worte in einem String einer bestimmten Länge wiederholen können.

Ich parse diesen String und weise jedem Wort eine ID zu. Genau das ist es was dann in der Tabelle auch gespeichert wird.

Wenn ich beim Parsen doppelte Worte suchen will, ist das recht aufwändig. Zumindest kenne ich keinen wirklich einfachen und effektiven Weg.

Ich bin aber für jeden Rat offen (gefallen tut mir das Ganze nämlich auch nicht)!
 
Helios co. schrieb:
Brauchen tue ich sie ja eben nicht. Das Problem ist, dass sich Worte in einem String einer bestimmten Länge wiederholen können.

Ich parse diesen String und weise jedem Wort eine ID zu. Genau das ist es was dann in der Tabelle auch gespeichert wird.

Wenn ich beim Parsen doppelte Worte suchen will, ist das recht aufwändig. Zumindest kenne ich keinen wirklich einfachen und effektiven Weg.

Ich bin aber für jeden Rat offen (gefallen tut mir das Ganze nämlich auch nicht)!

Also wenn du nur die Wörter in einem Text zählen willst, gibt es sicherlicht performantere Möglichkeiten, als die Wörter zuerst in eine Datenbank zu schreiben...

Spontan fallen mir zwei Sachen ein:

1) Text mit dem StringTokenizer zerpflücken und die Wörter in eine Liste Packen , sortieren und dann in einer Schleife durch gehen. Gleiche Wörter stehen immer hintereinander.

2) Text mit dem StringTokenizer zerpflücken und die Wörter in eine HashTable packen, wo das Wort der Schlüssel ist und der Wert bei jedem Auftreten des Worts um 1 erhöht wird.
 
Welche Sprache/Umgebung verwendest du für das Parsen bevor die Sachen in die Datenbank geschrieben werden? Wie snow1 schon geschrieben hat, gibt es Wege die doppelten Einträge recht schnell zu entfernen. Eine Alternative wäre noch das INSERT so zu gestalten, das nur neue Wörter in die Tabelle reingeschrieben werden. Dementsprechend müsste man aber wissen, welches DBMS (MySQL, Oracle, MS SQLServer ...) verwendet wird, weil sich bei dem Befehl die Syntax geringfügig ändert:

Beispiele:

Oracle:
Code:
INSERT INTO HELP2(TERM) 
SELECT 'Hello' 
FROM DUAL 
WHERE NOT EXISTS(SELECT * FROM HELP2 WHERE TERM='Hello')

SQLServer:
Code:
INSERT INTO HELP2(TERM) 
SELECT 'Hello' 
WHERE NOT EXISTS(SELECT * FROM HELP2 WHERE TERM='Hello')

MySQL (hier bin ich mir jedoch nicht 100% sicher, weil ich das nur aus der Hilfe/Referenz von MySQL nachgelesen habe! siehe http://dev.mysql.com/doc/refman/5.1/de/select.html):
Code:
-- entweder (analog zu Oracle)
INSERT INTO HELP2(TERM) 
SELECT 'Hello' 
FROM DUAL 
WHERE NOT EXISTS(SELECT * FROM HELP2 WHERE TERM='Hello')
-- oder (analog zu MS SQLServer)
INSERT INTO HELP2(TERM) 
SELECT 'Hello' 
WHERE NOT EXISTS(SELECT * FROM HELP2 WHERE TERM='Hello')

Im übrigen müsstest du dann noch deine ID Spalte ergänzen, wenn diese nicht von der DB automatisch gefüllt wird.

Insgesamt würde ich zur Absicherung noch einen Unique Index auf die Spalte TERM in HELP2 legen, um von vornherein zu verhindern, das doppelte Einträge gemacht werden. Zuvor musst du jedoch die doppelten Einträge entfernen.
 
Zuletzt bearbeitet: (Link zur MySQL Referenz hinzugefügt)
Zurück
Oben