FROM 절
FROM 절은 조회를 적용해야 하는 오브젝트의 콜렉션을 지정합니다. 각각의 콜렉션은 추상 스키마 이름(ASN)이나 관계를 식별하는 경로 표현식으로 지정됩니다. 식별 변수는 각 콜렉션별로 정의됩니다.
개념상으로 조회 시맨틱은 콜렉션에서 가능한 모든 오브젝트 조합으로 구성되는 요소로 튜플의 임시 콜렉션 R을 형성하는 것입니다. 이 콜렉션에는 경로 관계와 JOIN 연산으로 부과되는 제한조건이 적용됩니다. JOIN은 내부 또는 외부 결합이 될 수 있습니다.
식별 변수는 튜플 요소에 바인드됩니다. 임시 콜렉션을 형성한 후에는 WHERE 절의 검색 조건이 R에 적용되어 새로운 임시 콜렉션 R1이 작성됩니다. ORDER BY, GROUP BY, HAVING 및 SELECT 절은 R1에 적용되어 최종 결과를 작성합니다.
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
예: 콜렉션 결합
DeptBean에는 레코드 10, 20, 30이 포함됩니다. EmpBean은 부서 10과 관련된 레코드 1, 2 및 3을 포함하고 부서 20과 관련된 레코드 4, 5를 포함합니다. 부서 30에는 직원이 없습니다.
SELECT d FROM DeptBean AS d, EmpBean AS e
WHERE d.name = e.name
쉼표 구문은 가능한 모든 조합을 생성하는 내부 결합을 수행합니다. 이 예제에서, R은 15개의 튜플(3개의 부서 x 5명의 사원)로 구성됩니다. 콜렉션이 비어 있으면 R도 비어 있습니다. 키워드 AS는 선택사항입니다.
이 예제는 콜렉션이 자체와 결합할 수 있음을 보여줍니다.
SELECT d FROM DeptBean AS d, DeptBean AS d1
R은
9개의 튜플(3개의 부서 x 3개의 부서)로 구성됩니다. 예: 관계 결합
콜렉션은 다음에서와 같이 이전에 선언된 ID를 기초로 한
관계가 될 수 있습니다.
SELECT e FROM DeptBean AS d , IN (d.emps) AS e
R은
5개의 튜플을 포함합니다. 부서 30은 사원을 포함하지 않으므로 R에 표시되지 않습니다. 부서 10은
3개의 튜플에 표시되고 부서 20은 두 개의 튜플에 표시됩니다. IN은 다중 값 관계만
참조할 수 있습니다. 다음은 유효하지 않습니다. SELECT m FROM EmpBean e, IN( e.dept.mgr) as m INVALID
관계로
결합할 때 대체 구문 INNER JOIN(키워드 INNER는 선택사항임)도 다음과 같이 사용할 수
있습니다.
SELECT e FROM DeptBean AS d INNER JOIN d.emps AS e
ASN
선언(이전 조회에서 d)은 하나 이상의 연결 절이 이어질 수 있습니다. JOIN 키워드 다음에 오는 관계는 ASN 선언과(직접 또는 간접적으로)
관련되어야 합니다. IN 절의 경우와 달리, 결합절에서 사용된 관계는
단일 값 또는 다중 값 관계가 될 수 있습니다. 이 조회는 다음 조회와 동일한 시맨틱을 갖습니다. SELECT e FROM DeptBean AS d , IN (d.emps) AS e
여러 개의
결합을 함께 사용할 수 있습니다.
SELECT m FROM EmpBean e JOIN e.dept d JOIN d.mgr m
이는 다음과
같습니다. SELECT m FROM EmpBean e JOIN e.dept.mgr m
예: OUTER JOIN
OUTER JOIN은 left 및
right 피연산자 조합이 포함된 임시 콜렉션을 생성하고 관계 제한조건의
영향을 받기 때문에 left 피연산자는 항상 R에 표시됩니다. 예에서 외부 결합은 부서 30을 포함하는 임시
콜렉션 R이 되며 이는 콜렉션 d.emps가 비어 있는 경우에도 마찬가지입니다. 튜플에는
널값과 함께 부서 30이 포함됩니다. 조회에서 e를 참조하면
널값이 작성됩니다.
SELECT e FROM DeptBean AS d LEFT OUTER JOIN d.emps AS e
여기에
표시된 것처럼 키워드 OUTER는 선택사항입니다.
SELECT e FROM DeptBean AS d LEFT JOIN d.emps AS e
INNER 및
OUTER JOIN 조합을 사용할 수도 있습니다.
SELECT m FROM EmpBean e JOIN e.dept d LEFT JOIN d.mgr m