title image


Smiley OUTER JOIN nachbilden in MS Access (oder jeder anderen DB)
Sorry, da habe ich erstens einen Fehler und zweitens auch nicht die Unzulänglichkeiten von Access 2000 berücksichtigt. Korrekt wäre:

SELECT x.file AS file, x.wort AS wort, COUNT(*) AS anzahl

FROM (SELECT f.id, f.file, w.wort

FROM (SELECT DISTINCT wort

FROM worttable) w

JOIN filetable f) x

LEFT JOIN worttable w ON x.id = w.fileid AND

x.wort = w.wort

GROUP BY x.file, x.wort;Leider funktioniert dieser SELECT aber nicht in Access 2000, denn das kennt kein LEFT (OUTER) JOIN!

Und vermutlich kennt es auch kein normales JOIN, muss also mit dem "Komma-Operator" nachgebildet werden.

Gut, wie kriegen wir jetzt unser Datensätze trotzdem raus?

Theoretisch bekommen wir alle vorhandenen Sätze ziemlich simpel mit:

SELECT f.file AS file, w.wort AS wort, COUNT(*) AS anzahl

FROM filetable f, worttable w

WHERE f.id = w.fileid

GROUP BY f.file, w.wort;Dann fehlen uns aber die Worte, die in den einzelnen Dateien nicht vorkommen (...mir fehlen die Worte ). Also müssen wir die noch herausfinden.

Dazu erzeugen wir uns zuerst mal einen SELECT, der uns alle Worte ausgibt:

SELECT DISTINCT wort

FROM worttable; Diesen JOINEN wir mit filetable OHNE JOIN-Bedingung und erzeugen damit ein kartesisches Produkt, also eine Kreuztabelle, die jeden mit jedem Satz der beiden Tabellen verbindet:

SELECT f.file, w.wort

FROM (SELECT DISTINCT wort

FROM worttable) w,

filetable f;Jetzt müssen wir davon noch die Datensätze herausnehmen, die in dem simplen SELECT von oben bereits vorkommen:

SELECT f.file, w.wort

FROM (SELECT DISTINCT wort

FROM worttable) w,

filetable f

WHERE NOT EXISTS (SELECT wort

FROM worttable w1

WHERE f.id = w1.fileid

AND w.wort = w1.wort);Alle diese Sätze haben also als Ergebnis eine 0 stehen. Das können wir jetzt per UNION oben anhängen:

SELECT f.file AS file, w.wort AS wort, COUNT(*) AS anzahl

FROM filetable f, worttable w

WHERE f.id = w.fileid

GROUP BY f.file, w.wort

UNION

SELECT f.file, w.wort, 0

FROM (SELECT DISTINCT wort

FROM worttable) w,

filetable f

WHERE NOT EXISTS (SELECT wort

FROM worttable w1

WHERE f.id = w1.fileid

AND w.wort = w1.wort);Ich bin mir nicht sicher, ob man das jetzt schon sortieren kann, indem man "ORDER BY file, wort, anzahl" hinten anhängt.

Wenn nicht, dann muss man den vorhandenen SELECT einfach wiederum klammern und davor noch "SELECT file, wort, anzahl FROM (" und dahinter ") x ORDER BY file, wort, anzahl" schreiben.



Jetzt sollte es funktionieren.



Gruß

Saluk

diu vive floreque.
Spockus

erreicht am 04.03.2008 09:47:23

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: