Zitat von
theomega:
Gut, die Sache funktioniert ganz gut, nur eine Sache stört mich noch: Bis jetzt werden ja Ordner ausgeblendet, wenn für sie nicht mindestens ein Eintrag in allen 4 Tabellen existiert. Wie bekomme ich es hin, das selbst wenn jetzt kein Konto-eintrag für eine Funktion existiert, trotzdem die Funktion zurückgegeben wird, dann ohne einen Eintrag für das Konto.
Hallo TheOmega!
Um Datensätze anzeigen zu lassen, die keinen Foreign Key Wert besitzen (d.h. bei denen dieser Wert NULL ist) muss man nun einen Outer Join verwenden. Der Outer Join nimmt alle Datensätze einer der beiden Tabellen (oder beider) Tabellen mit in die Ergebnisdatenmenge auf. Damit angegeben werden kann, welche Datensätze auch ohne FK in die Ergebnisdatenmenge sollen, wird eine Tabelle als linke und eine als rechte Tabelle bezeichnet (hängt von der Poisition der Tabelle in Bezug auf das Gleichheitszeichen innerhalb der Where-Klausel ab. Ein Right-Outer Join nimmt alle Datensätze, bei denen der FK Null ist der rechten Tabelle mit, ein Left-Outer Join nimmt alle Datensätze der linken Tabelle mit.
Unglücklicherweise unterscheidet sich hier die Syntax der einzelnen
SQL-Dialekte (soweit zum Standard
SQL). Codetechnisch sieht das ganze dann unter Oracle folgendermassen aus:
SQL-Code:
SELECT
*
FROM
SACHBUCH SB,
GLIEDERUNG GL,
FUNKTION FK,
KONTO KO
WHERE
(SB.SACHBUCH_ID = GL.SACHBUCH_ID) AND
(GL.GLIEDERUNG_ID = FK.GLIEDERUNG_ID) AND
(FK.FUNKTION_ID = KO.FUNKTION_ID (+));
In diesem Beispiel haben wir einen right Inner Join zwischen FK.FUNKTION_ID und KO.FUNKTION_ID definiert, d.h. es werden auch die Datensätze aus der Tabelle KONTO in die Ergebnisdatenmenge aufgenommen, die keinen Wert im Feld FUNKTION_ID besitzen.
Leider weiss ich nicht, wie genau man das unter Firebird syntaktisch formuliert. Ich tippe auf irgendwas wie:
FK.FUNKTION RIGHT INNER JOIN KO.FUNKTION_ID
Viele Grüsse
Frank