SQL Ausgabe als neue Spalte speichern

rezzzi

Benutzer
Beiträge
5
Hallo :)

Ich habe eine Tabelle 'lexikon' (Spalte word) und eine Tabelle 'Sätze'(Spalte content).
Nun suche in in 'Sätze' wie oft jedes Wort aus 'lexikon' vorkommt. Hierfür folgender Befehl:

SELECT word, COUNT(content) AS anzahl
FROM lexikon
LEFT JOIN Sätze ON
Sätze.content
LIKE CONCAT ('%',' ',lexikon.word, '%')
OR
Sätze.content
LIKE CONCAT (lexikon.word, '%')
OR
Sätze.content
LIKE CONCAT ('%',' ',lexikon.word)
WHERE Stern='ja'
GROUP BY word

Stern und die Like Bedingungen können vorerst unbeachtet bleiben.

Nun möchte ich, wenn ich diesen Befehl ausführe, nicht nur eine Ausgabetabelle bekommen, sondern diese Häufigkeiten direkt in die Tabelle Lexikon, in die von mir erstellt Spalte 'ANZAHL' eintragen.
Habe es mit INSERT INTO und UPDATE versucht. Aber irgendwie klappt es nicht richtig.
Bei Insert Into werden die Ergebnisse nur an das Lexikon drangehängt aber nicht den Worten zugeordnet. Bei UPDATE weiß ich nicht genau wie sich SET und SELECT verstehen.

Danke für die Hilfe! :)
 
Werbung:
Ich werte insgesamt 5.Mio Daten aus und dieser Durchlauf dauert sehr lange.
Jetzt habe ich das ganze schon in kleinere Tabellen aufgesplittet.
Um aber nicht immer die Ausgabetabelle exportieren zu müssen, hätte ich es gerne fest in der Datenbank drin.
Einfach, um im Endeffekt nichts zu vergessen beim exportieren.

Wieso sind sie dann redundant?
 
Gerne kann das Ergebnis auch in einer neuen Tabelle erstellt werden. Ich möchte es nur als feste Tabelle haben.

Bei den Auswertungen klicke ich einmal falsch und schon sind sie weg :)

Vielen Dank :)
 
Eine Möglichkeit, ja.

Es wird am Ende trotzdem eine große Anzahl an Dateien sein, die Durcheinander hervorrufen.

Sollte noch jemand eine Idee haben, wie ich die Formel umstellen kann, sodass die Häufigkeiten direkt in 'Lexikon' stehen, bin ich dankbar für alle Vorschläge! :)
 
Ich habe ja um die 35 einzelnen Tabellen mit den 'Sätzen' drin. D.h. jede Werte ich einzeln aus und für jede entsteht dann ein View.
Den fasse ich dann am Ende einfach zusammen. Wird schon funktionieren. Die Umstände machen alles derzeit nur etwas umständlich.

Aber danke schonmal für die Hilfe mit dem View.
 
Also mehrere Tabellen für die selbe Entität zu nehmen ist eigentlich immer verkehrt und ich würde dringend abraten.

Ergebnisse zwischenspeichern kann man machen, ist aber i.d.R. mit Aufwand verbunden weil man die Information ja aktuell halten muss. Kann man machen wenn man wirklich große Auswertungen fährt.

Hier mal ein Ansatz zur Beschleunigung (WITH () erstellt nur meine testtabelle, das geht nicht unter MySQL):
Code:
WITH testtabelle AS (
    SELECT    'Hallo Welt dies ist eine Test-Text für das Wort Welt' AS testtext
    )

SELECT    testtext AS [text],
        (datalength(testtext)
        - datalength(replace(testtext,'Welt','')))
        / datalength('Welt') AS anzahl
FROM    testtabelle

PS: Ich würde die Anzahl eines Wortes aber nie in der Tabelle mit dem Text speichern sondern seperat, ggf. mit den Suchwörtern zusammen in einer Tabelle und Referenz auf den Text.
 
Zuletzt bearbeitet:
Werbung:
Nun möchte ich, wenn ich diesen Befehl ausführe, nicht nur eine Ausgabetabelle bekommen, sondern diese Häufigkeiten direkt in die Tabelle Lexikon, in die von mir erstellt Spalte 'ANZAHL' eintragen.

Mal als Fingerübung:

Code:
test=*# select * from lexikon ;
  wort   
------------   
 MySQL   
 PostgreSQL   
 Regeln   
 Woche   
 Oraggle
(5 rows)

Time: 0,235 ms
test=*# select * from saetze ;
 id |  content
----+-----------------------------------------------------------------------------
  1 | PostgreSQL ist besser als MySQL
  2 | Bitte immer die Regeln der Normalisierung beachten
  3 | Nächste Woche erscheint PostgreSQL 9.4 offiziell - bitte nicht weitersagen!
(3 rows)

Time: 0,173 ms
test=*# select lexikon.wort, count(wortliste) from lexikon left join (select regexp_split_to_table(content,' ') as wort from saetze) wortliste on lexikon.wort=wortliste.wort group by lexikon.wort;
  wort  | count
------------+-------
 Regeln  |  1
 MySQL  |  1
 Woche  |  1
 Oraggle  |  0
 PostgreSQL |  2
(5 rows)

Time: 0,462 ms
test=*# alter table lexikon add column anzahl int;
ALTER TABLE
Time: 0,427 ms
test=*# update lexikon set anzahl=c from (select lexikon.wort, count(wortliste) as c from lexikon left join (select regexp_split_to_table(content,' ') as wort from saetze) wortliste on lexikon.wort=wortliste.wort group by lexikon.wort) foo where lexikon.wort=foo.wort;
UPDATE 5
Time: 0,739 ms
test=*# select * from lexikon ;
  wort  | anzahl
------------+--------
 Regeln  |  1
 MySQL  |  1
 Woche  |  1
 Oraggle  |  0
 PostgreSQL |  2
(5 rows)

Time: 0,201 ms


Hier sind aber Konstrukte drin, die in MySQL nicht gehen. Beachte id=1 in Tabelle saetze ;-)
 
Zurück
Oben