Clause FROM
La *clause FROM indique les collections d'objets auxquels l'interrogation devra s'appliquer. Chaque collection est désignée soit par un nom de schéma abstrait (ASN) soit par une expression de chemin identifiant une relation. Une variable d'identification est désignée pour chaque collection.
D'une manière conceptuelle, la sémantique de la requête consiste à former une collection temporaire de blocs de données, R, avec des éléments comportant toutes les combinaisons possibles d'objets des collections. Cette collection est soumise à des contraintes imposées par toute relation de chemin d'accès et par l'opération JOIN. L'opération JOIN peut être une jointure interne ou externe.
Les variables d'identification sont liées aux éléments du bloc de données. Une fois la collection temporaire formée, les conditions de recherche de la clause WHERE sont appliquées à R, et renvoient une nouvelle collection temporaire, R1. Les clauses ORDER BY, GROUP BY, HAVING, et SELECT sont appliquées à R1 pour renvoyer le résultat final.
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
Exemples : joindre des collections
DeptBean contient les enregistrements 10, 20 et 30. EmpBean contient les enregistrements 1, 2 et 3 relatifs à la division 10 et les enregistrements 4 et 5 relatifs à la division 20. La division 30 ne comporte aucun employé.
SELECT d FROM DeptBean AS d, EmpBean AS e
WHERE d.name = e.name
La syntaxe avec virgule effectue une jointure interne contenant toutes les combinaisons possibles. Dans cet exemple, R contiendrait 15 blocs de données (3 divisions x 5 employés). Lorsqu'une collection est vide, R l'est également. Le mot clé AS est facultatif.
SELECT d FROM DeptBean AS d, DeptBean AS d1
R contiendrait 9 blocs de données (3 divisions x 3 employés). Exemples : jointures de relations
SELECT e FROM DeptBean AS d , IN (d.emps) AS e
R comporterait 5 blocs de données. La division 30 n'apparaîtrait pas dans R car elle ne contient aucun employé. La division 10 apparaîtrait dans 3 blocs de données et la division 20, dans 2. IN ne peut faire référence qu'à des relations multiforme. Ce qui suit n'est pas valideSELECT m FROM EmpBean e, IN( e.dept.mgr) as m INVALID
SELECT e FROM DeptBean AS d INNER JOIN d.emps AS e
Une déclaration ASN (d dans la requête précédente) peut être suivie d'une ou de plusieurs clauses de jointure. La relation suivant le mot clé JOIN doit être liée (directement ou indirectement) à la déclaration ASN. Contrairement à la clause IN, les relations utilisées dans une clause de jointure peuvent être mono ou multiforme. Cette requête présente la même syntaxe que la requête SELECT e FROM DeptBean AS d , IN (d.emps) AS e
SELECT m FROM EmpBean e JOIN e.dept d JOIN d.mgr m
Cela équivaut à SELECT m FROM EmpBean e JOIN e.dept.mgr m
Exemples : OUTER JOIN (jointure externe)
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