Hallo Ihr,
ich bin auf der Suche nach einem passenden SQL-Statement, bin in dem Bereich noch ein ziemlicher Neuling. Einfache SELECTs und dergleichen bekomme ich hin, allerdings habe ich noch keine Lösung für folgende Problemstellung gefunden:
Ich habe eine Datenbank in der soweit erstmal auch nur eine Tabelle existiert (Name: "List"). Der Aufbau der Tabelle sieht wie folgt aus:
ID : INTEGER IDENTITY PRIMARY KEY
Word: VARCHAR(10)
Lang: VARCHAR(3)
In dieser Tabelle sollen, wie man an den Spalten evtl schon erkennen kann, Wortlisten von versch. Sprachen abgespeichert werden.
Nun möchte ich folgendes anwenden: Wenn ein Wort (in der Spalte "Word") mehr als einmal vorkommt (also z.B. aus Versehen doppelt in der gleichen Sprache oder eben auch in einer anderen Sprache) dann sollen die entsprechenden Zeilen aus dem Tabelle gelöscht werden.
Bsp:
(ID, Word, Lang)
(1, die, german)
(2, der, german)
(3, the, english)
(4, house, english)
(5, die, english)
(6, maison, french)
(7, gracias, spanish)
...
In diesem Fall sollen die Zeilen 1 und 5 aus der Tabelle komplett gelöscht werden, weil eben "die" in beiden Wortlisten erscheint. Mit DISTINCT komme ich auch irgendwie nicht weiter, da ja dann ein Eintrag von den doppelten (dreifachen, ...) immer stehen bleibt, ich aber alle Zeilen löschen möchte.
Ich bräuchte quasi ein Statement, das einmal die doppelten Wörter identifiziert und auf diese Liste müsste ich dann eben den Löschprozess ansetzen. Oder vielleicht geht dies auch in einem Befehl?
Ich weiss es nicht und ich hoffe ihr könnt mir helfen :-)
Herzlichen Dank schonmal.
Gruss
Jens
Seite 1 von 1
Sql-statement Gesucht
Anzeige
#2
geschrieben 06. Oktober 2005 - 11:09
Hallo Jens,
es gibt mehrere Wege um dein Problem zu lösen.
Hier eine einfache T-SQL Lösung:
Wenn du auf hohe Performance Wert legst, dann solltest du das Ganze mit Stored Procedures und Triggern lösen. Die Implementierung ist dann aber von der verwendeten Datenbank abhängig
es gibt mehrere Wege um dein Problem zu lösen.
Hier eine einfache T-SQL Lösung:
delete from List where exists ( select id from List L1 where List.Word = L1.Word and List.id <> L1.id )
Wenn du auf hohe Performance Wert legst, dann solltest du das Ganze mit Stored Procedures und Triggern lösen. Die Implementierung ist dann aber von der verwendeten Datenbank abhängig
#3
geschrieben 06. Oktober 2005 - 11:15
wenn du möchtest, dass ein Wort immer nur einmal vorkommt, dann kannst du das Schlüsselwort UNIQUE für die Spalte Word zusätzlich einfügen. So können schon bei der Eintragung keine doppelten Wörter vorkommen
#4
geschrieben 06. Oktober 2005 - 11:45
Hallo,
@constructor
grundsätzlich scheint dein SQL Statement oben zu funktionieren, allerdings wirklich nur bei kleinen Tabellen. Meine Tabelle wird einige Mio Einträge enthalten und in diesem Fall dauert es ewig (habe es nach 15 Minuten mal abgebrochen bei einer Eintragszahl von 600.000)
Noch als Info: Ich nutze als Datenbank die Open Soruce Datenbank "HSQLDB"...
Mit Triggern habe ich bisher noch nicht gearbeitet, hast du evtl ne Idee, wie das funktioniert?
Vielen Dank
@constructor
grundsätzlich scheint dein SQL Statement oben zu funktionieren, allerdings wirklich nur bei kleinen Tabellen. Meine Tabelle wird einige Mio Einträge enthalten und in diesem Fall dauert es ewig (habe es nach 15 Minuten mal abgebrochen bei einer Eintragszahl von 600.000)
Noch als Info: Ich nutze als Datenbank die Open Soruce Datenbank "HSQLDB"...
Mit Triggern habe ich bisher noch nicht gearbeitet, hast du evtl ne Idee, wie das funktioniert?
Vielen Dank
#5
geschrieben 06. Oktober 2005 - 13:31
Hallo Jens,
sorry, die Java-Datenbank und deren Möglichkeiten kenne ich leider nicht sonderlich gut
Über Google findest du mit dem Suchstring "t-sql duplicate records delete" einige Lösungswege über Trigger - allerdings meistens für MS-SQL oder Oracle. Vielleicht ist aber ein Ansatzpunkt für HSQLDB dabei.
Viel Erfolg!
sorry, die Java-Datenbank und deren Möglichkeiten kenne ich leider nicht sonderlich gut
Über Google findest du mit dem Suchstring "t-sql duplicate records delete" einige Lösungswege über Trigger - allerdings meistens für MS-SQL oder Oracle. Vielleicht ist aber ein Ansatzpunkt für HSQLDB dabei.
Viel Erfolg!
Dieser Beitrag wurde von constructor bearbeitet: 06. Oktober 2005 - 13:34
#6
geschrieben 06. Oktober 2005 - 13:37
CREATE UNIQUE List2 AS (SELECT DISTINCT * FROM List); RENAME List2 List
Danach sollte du am besten Trigger setzen.
Danach sollte du am besten Trigger setzen.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Ja, mata ne!
(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
Ja, mata ne!
(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
#7
geschrieben 07. Oktober 2005 - 08:33
du solltest alle in häufigen vergleichsoperationen vorkommendne felder indizieren. so kann um ein vielfaches schneller ein hit oder miss auf eine zeile gefunden werden (in diesem fall List.Word indizieren).
I'm mó. mo's good twin.
#8
geschrieben 07. Oktober 2005 - 10:56
Hallo,
das mit dem Indizieren habe ich schon gemacht. Nur ist obiges SQL-Statement nur immer noch für meinen Zweck zu ineffizient bzw. es dauert einfach ewig bei derart vielen Einträgen (trotz Indizierung).
Frage mich nun, wie denn besagter Trigger aussehen würde? HSQL unterstützt auf jeden Fall Trigger, habe ich mich schon informiert...
Danke
das mit dem Indizieren habe ich schon gemacht. Nur ist obiges SQL-Statement nur immer noch für meinen Zweck zu ineffizient bzw. es dauert einfach ewig bei derart vielen Einträgen (trotz Indizierung).
Frage mich nun, wie denn besagter Trigger aussehen würde? HSQL unterstützt auf jeden Fall Trigger, habe ich mich schon informiert...
Danke
#9
geschrieben 07. Oktober 2005 - 12:31
Langsam?
Nochmal: Du filterst einmalig die Tabelle von Duplikaten, kopierst sie in eine neue Tabelle mit als UNIQUE definierten Einträgen und legst dann einen UNIQUE INDEX an. Dann wird bei jedem Einfügevorgang extrem schnell überprüft, ob der Eintrag bereits vorhanden ist und einfach gar nicht eingefügt wird
Die langsamere Methode, die allerdings potentiell ähnliche Wörter mit einbeziehen kann, sind halt Trigger.
CREATE TRIGGER Triggername
AFTER
INSERT ON Tabelle,
UPDATE ON Tabelle
FOR EACH TABLE
($Duplikateliminierung_mit_unscharfem_Vergleich
)
In SQL2003 kann man gar INSERT NewValue ON verwenden, um direkt den neuen Eintrag zu referenzieren. Das ist dann natürlich wieder sehr schnell.
Nochmal: Du filterst einmalig die Tabelle von Duplikaten, kopierst sie in eine neue Tabelle mit als UNIQUE definierten Einträgen und legst dann einen UNIQUE INDEX an. Dann wird bei jedem Einfügevorgang extrem schnell überprüft, ob der Eintrag bereits vorhanden ist und einfach gar nicht eingefügt wird
Die langsamere Methode, die allerdings potentiell ähnliche Wörter mit einbeziehen kann, sind halt Trigger.
CREATE TRIGGER Triggername
AFTER
INSERT ON Tabelle,
UPDATE ON Tabelle
FOR EACH TABLE
($Duplikateliminierung_mit_unscharfem_Vergleich
)
In SQL2003 kann man gar INSERT NewValue ON verwenden, um direkt den neuen Eintrag zu referenzieren. Das ist dann natürlich wieder sehr schnell.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Ja, mata ne!
(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
Ja, mata ne!
(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
#10
geschrieben 07. Oktober 2005 - 18:29
Hallo Rika,
ich meinte nicht deinen Code, sondern den von deinem Vorposter... So, wie ich jedoch deinen Code verstanden habe ist es so, dass eben dann doch ein Eintrag vorhanden ist, von denen die ich eigentlich auch raus haben möchte.
Ich mein, dass ich keinerlei Eintrag mehr drin habe, der eben mehrfach auftaucht. Habe jetzt eine Lösung über folgenden Weg gefunden. Laut meinen bisherigen Tests auch richtig schnell, auch bei einigen Mio Datensätzen.
Ich habe parallel eine 2. Tabelle erstellt und dort speicher ich Wörter rein, die eben mehr als einmal vorkommen. Prüfe vor dem Einfügen in die Orginaltabelle, ob der Begriff bereits in der Orginalliste vorhanden ist, wenn Ja, dann wird es nicht hinzugefügt zur OrginalListe und gleichzeitig in die Delete-Tabelle eingetragen... Am Ende wende ich dann folgendes SQL-Statement an:
DELETE FROM List WHERE List.Word in (SELECT DeleteTable.DelWord FROM DeleteTable)
Was hälst du von der Lösung Rika?
MfG
Jens
ich meinte nicht deinen Code, sondern den von deinem Vorposter... So, wie ich jedoch deinen Code verstanden habe ist es so, dass eben dann doch ein Eintrag vorhanden ist, von denen die ich eigentlich auch raus haben möchte.
Ich mein, dass ich keinerlei Eintrag mehr drin habe, der eben mehrfach auftaucht. Habe jetzt eine Lösung über folgenden Weg gefunden. Laut meinen bisherigen Tests auch richtig schnell, auch bei einigen Mio Datensätzen.
Ich habe parallel eine 2. Tabelle erstellt und dort speicher ich Wörter rein, die eben mehr als einmal vorkommen. Prüfe vor dem Einfügen in die Orginaltabelle, ob der Begriff bereits in der Orginalliste vorhanden ist, wenn Ja, dann wird es nicht hinzugefügt zur OrginalListe und gleichzeitig in die Delete-Tabelle eingetragen... Am Ende wende ich dann folgendes SQL-Statement an:
DELETE FROM List WHERE List.Word in (SELECT DeleteTable.DelWord FROM DeleteTable)
Was hälst du von der Lösung Rika?
MfG
Jens
#11
geschrieben 07. Oktober 2005 - 23:19
Irgndwie habe ich das Gefühl, daß du alles überliest.
Nochmal: Kein Code, kein Trigger, nix, nirgendwo1 Einmalig die Tabelle ohne Duplikate anlegen und als UNIQUE definieren, dann kommen auch nie mehr Duplikate rein - es wird vor dem Einfügen geprüft.
Nochmal: Kein Code, kein Trigger, nix, nirgendwo1 Einmalig die Tabelle ohne Duplikate anlegen und als UNIQUE definieren, dann kommen auch nie mehr Duplikate rein - es wird vor dem Einfügen geprüft.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Ja, mata ne!
(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
Ja, mata ne!
(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
Thema verteilen:
Seite 1 von 1