WinFuture-Forum.de: Sql-statement Gesucht - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Sql-statement Gesucht


#1 Mitglied ist offline   Yaenzi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 139
  • Beigetreten: 17. November 03
  • Reputation: 0
  • Wohnort:Ludwigsburg

  geschrieben 06. Oktober 2005 - 09:09

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
0

Anzeige



#2 Mitglied ist offline   constructor 

  • Gruppe: aktive Mitglieder
  • Beiträge: 112
  • Beigetreten: 18. April 05
  • Reputation: 0

  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:

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
0

#3 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.947
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

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
0

#4 Mitglied ist offline   Yaenzi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 139
  • Beigetreten: 17. November 03
  • Reputation: 0
  • Wohnort:Ludwigsburg

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
0

#5 Mitglied ist offline   constructor 

  • Gruppe: aktive Mitglieder
  • Beiträge: 112
  • Beigetreten: 18. April 05
  • Reputation: 0

geschrieben 06. Oktober 2005 - 13:31

Hallo Jens,

sorry, die Java-Datenbank und deren Möglichkeiten kenne ich leider nicht sonderlich gut ;D

Ü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

0

#6 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 06. Oktober 2005 - 13:37

CREATE UNIQUE List2 AS (SELECT DISTINCT * FROM List); RENAME List2 List
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.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#7 Mitglied ist offline   mo 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.796
  • Beigetreten: 17. Juni 02
  • Reputation: 0
  • Wohnort:Ulm / BaWü

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.
0

#8 Mitglied ist offline   Yaenzi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 139
  • Beigetreten: 17. November 03
  • Reputation: 0
  • Wohnort:Ludwigsburg

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
0

#9 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

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.
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.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#10 Mitglied ist offline   Yaenzi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 139
  • Beigetreten: 17. November 03
  • Reputation: 0
  • Wohnort:Ludwigsburg

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
0

#11 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

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.
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.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0