Cláusula FROM
La cláusula FROM especifica las colecciones de objetos a los que se debe aplicar la consulta. Cada colección se especifica mediante un nombre de esquema abstracto (ASN) o mediante una expresión de vía de acceso que identifique una relación. Se define una variable de identificación para cada colección.
Conceptualmente, la semántica de la consulta es para formar una colección temporal de tuplas, R, con elementos que consten de todas las combinaciones posibles de objetos procedentes de las colecciones. Esta colección está sujeta a las restricciones impuestas por cualquiera de las relaciones de vía de acceso o por la operación JOIN. La operación JOIN puede ser una operación interna o externa.
Las variables de identificación se enlazan con elementos del tuple. Después de formar la colección temporal, las condiciones de búsqueda de la cláusula WHERE se aplican a R y generan una nueva colección temporal, R1. Las cláusulas ORDER BY, GROUP BY, HAVING y SELECT se aplican a R1 para generar el resultado 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
Ejemplos: unión de colecciones
DeptBean contiene los registros 10, 20 y 30. EmpBean contiene los registros 1, 2 y 3 que están relacionados con el departamento 10 y los registros 4 y 5 que están relacionados con el departamento 20. El departamento 30 no tiene empleados.
SELECT d FROM DeptBean AS d, EmpBean AS e
WHERE d.name = e.name
La sintaxis de comas lleva a cabo una unión interna que de como resultado todas las combinaciones posibles. En este ejemplo, R constaría de 15 tuplas (3 departamentos x 5 empleados). Si una colección está vacía, R también está vacía. La palabra clave AS es opcional.
SELECT d FROM DeptBean AS d, DeptBean AS d1
R constaría de 9 tuplas (3 departamentos x 3 departamentos). Ejemplos: uniones de relaciones
SELECT e FROM DeptBean AS d , IN (d.emps) AS e
R contendría 5 tuplas. El departamento 30 no aparecería en R porque no
contiene empleados. El departamento 10 aparecería en 3 tuplas y el
departamento 20 en 2 tuplas. IN sólo puede hacer referencia a relaciones
de varios valores. La siguiente consulta no es válidaSELECT m FROM EmpBean e, IN( e.dept.mgr) as m INVALID
SELECT e FROM DeptBean AS d INNER JOIN d.emps AS e
Una declaración de ASN (d en la consulta anterior) puede ir seguida de una o más
cláusulas JOIN. La relación que aparezca después de la
palabra clave JOIN debe estar relacionada directamente o
indirectamente con una declaración de ASN. A diferencia de lo que ocurre
con la cláusula IN, las relaciones que se utilizan en una cláusula JOIN
puede ser de un solo valor o de varios valores.
Esta consulta tiene la
misma semántica que la consulta SELECT e FROM DeptBean AS d , IN (d.emps) AS e
SELECT m FROM EmpBean e JOIN e.dept d JOIN d.mgr m
Esta consulta equivale a SELECT m FROM EmpBean e JOIN e.dept.mgr m
Ejemplos: 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