FROM-Klausel
Die FROM-Klausel gibt die Objektgruppen an, auf die die Abfrage angewendet werden soll. Jede Objektgruppe wird entweder von einem ASN (Abstract Schema Name) oder von einem Pfadausdruck, der eine Beziehung angibt, definiert. Für jede Objektgruppe wird eine Identifikationsvariable definiert.
Konzeptionell muss die Semantik der Abfrage zunächst eine temporäre Sammlung von Tupeln bilden, R, mit Elementen, die aus allen möglichen Objektkombinationen aus den Objektgruppen bestehen. Diese Objektgruppe ist den Einschränkungen unterworfen, die von allen Pfadbeziehungen und der JOIN-Operation vorgegeben werden. Das JOIN kann eine innere oder eine äußere Verknüpfung sein.
Die Identifikationsvariablen sind an Elemente des Tupel gebunden. Nach der Bildung der temporären Collection werden die Suchbedingungen der WHERE-Klausel auf R angewendet. Das ergibt eine neue temporäre Collection R1. Die Klauseln ORDER BY, GROUP BY, HAVING und SELECT werden auf R1 angewendet und liefern das endgültige Ergebnis.
from_clause::=FROM identification_variable_declaration [, {identification_variable_declaration |
collection_member_declaration } ]*
identification_variable_declaration::= range_variable_declaration [join]*
join := [ { LEFT [OUTER] | INNER }] JOIN {collection_valued_path_expression | single_valued_path_expression} [AS] identifier
Beispiele: Collections verknüpfen
DeptBean enthält die Datensätze 10, 20 und 30. EmpBean enthält die Datensätze 1, 2 und 3, die der Abteilung (Department) 10 zugeordnet sind, und die Datensätze 4 und 5, die der Abteilung 20 zugeordnet sind. Abteilung 30 hat keine zugeordneten Mitarbeiter.
SELECT d FROM DeptBean AS d, EmpBean AS e
WHERE d.name = e.name
Die Kommasyntax führt eine innere Verknüpfung durch, die zu allen möglichen Kombinationen führt. In diesem Beispiel würde R aus 15 Tupeln bestehen (3 Abteilungen x 5 Mitarbeiter). Wenn eine Collection leer ist, dann ist R ebenfalls leer. Das Schlüsselwort AS ist optional.
SELECT d FROM DeptBean AS d, DeptBean AS d1
R würde aus 9 Tupeln bestehen (3 Abteilungen x 3 Abteilungen). Beispiele: Beziehungsverknüpfungen
SELECT e FROM DeptBean AS d , IN (d.emps) AS e
R
würde 5 Tupel enthalten. Abteilung 30 würde nicht in R erscheinen, da sie keine Mitarbeiter enthält. Abteilung 10 würde in 3 Tupeln und Abteilung 20 in 2 Tupeln erscheinen. IN kann sich nur auf Beziehungen mit mehreren Werten beziehen. Der folgende Ausdruck ist nicht gültig: SELECT m FROM EmpBean e, IN( e.dept.mgr) as m INVALID
SELECT e FROM DeptBean AS d INNER JOIN d.emps AS e
Auf eine
ASN-Deklaration ("d" in der obigen Abfrage) können ein oder mehrere JOIN-Klauseln folgen. Die Beziehung, die auf das Schlüsselwort JOIN folgt, muss sich direkt oder indirekt auf die ASN-Deklaration beziehen. Im Gegensatz zu dem Fall mit der IN-Klausel können Beziehungen in einer JOIN-Klausel einen oder mehrere Werte haben. Diese Abfrage hat dieselbe Semantik wie die Abfrage SELECT e FROM DeptBean AS d , IN (d.emps) AS e
SELECT m FROM EmpBean e JOIN e.dept d JOIN d.mgr m
Das ist äquivalent zu SELECT m FROM EmpBean e JOIN e.dept.mgr m
Beispiele: OUTER JOIN
SELECT e FROM DeptBean AS d LEFT OUTER JOIN d.emps AS e
SELECT e FROM DeptBean AS d LEFT JOIN d.emps AS e
SELECT m FROM EmpBean e JOIN e.dept d LEFT JOIN d.mgr m