joined-table
조인된 테이블은 내부 조인 또는 외부 조인의 결과인 중간 결과 테이블을 지정합니다. 테이블은 조인 연산자 CROSS, INNER, LEFT OUTER, RIGHT OUTER 또는 FULL OUTER 중 하나를 피연산자에 적용하여 파생됩니다.
.-INNER-----. >>-+-table-reference--+-----------+--JOIN--table-reference--+-ONjoin-condition---------+-+->< | '-| outer |-' '-USING(-| column-list |-)-' | +-table-reference--CROSS JOIN--table-reference----------------------------------------+ '-(--joined-table--)------------------------------------------------------------------' outer .-OUTER-. |--+-LEFT--+--+-------+-----------------------------------------| +-RIGHT-+ '-FULL--' column-list .-,-----------. V | |----column-name-+----------------------------------------------|
- 교차 조인
- 테이블의 교차 곱을 나타내며, 교차 곱에서는 왼쪽 테이블의 각 행이 오른쪽 테이블의 모든 행과 결합됩니다.
- 내부 조인
- 조인 조건이 맞는 행만 보존합니다. 조인 조건이 맞지 않는 각 조인 테이블의 행은 결과 테이블에서 제외됩니다.
- 외부 조인
- 조인 조건이 맞는 행 및 추가적인 행을 포함합니다.
- 왼쪽 외부 조인
- 또한 조인 조건이 맞지 않는 왼쪽 테이블의 행도 포함합니다.
- 오른쪽 외부 조인
- 또한 조인 조건이 맞지 않는 오른쪽 테이블의 행도 포함합니다.
- 완전 외부 조인
- 또한 조인 조건이 맞지 않는 왼쪽 및 오른쪽 테이블 모두의 행도 포함합니다.
T1 LEFT JOIN T2 ON T1.C1=T2.C1
RIGHT JOIN T3 LEFT JOIN T4 ON T3.C1=T4.C1
ON T1.C1=T3.C1
(T1 LEFT JOIN T2 ON T1.C1=T2.C1)
RIGHT JOIN (T3 LEFT JOIN T4 ON T3.C1=T4.C1)
ON T1.C1=T3.C1
조인된 테이블은 SELECT문의 형식이 사용되는 컨텍스트에서 사용될 수 있습니다. SELECT문에 조인된 테이블이 포함되면 뷰 또는 커서가 읽기 전용입니다.
컬럼 참조는 컬럼 이름 규정자의 분석 규칙을 사용하여 결정됩니다. 술어에 적용되는 동일한 규칙이 조인 조건에 적용됩니다.
조인 연산
T1의 행이 T2의 행과 조인되면 결과 행은 T2의 해당 행 값과 병합된 T1의 해당 행 값으로 구성됩니다. 조인 연산의 결과로 널(NULL) 행이 생성될 수 있습니다. 널(NULL) 행은 컬럼에서 널(NULL) 값이 허용되는지 여부와 상관없이 각 테이블 컬럼의 널(NULL) 값으로 구성됩니다.
- T1 CROSS JOIN T2의 결과는 행에서 가능한 모든 쌍으로 구성됩니다.
- T1 INNER JOIN T2의 결과는 join-condition이 참이고 쌍을 이루는 행으로 구성됩니다.
- T1 LEFT OUTER JOIN T2의 결과는 join-condition이 참인 쌍을 이루는 행, 그리고 쌍을 이루지 않는 T1의 각 행에 대해 T2의 널(NULL) 행과 해당 행의 병합으로 구성됩니다. T2에서 파생된 모든 컬럼에는 널(NULL) 값이 허용됩니다.
- T1 RIGHT OUTER JOIN T2의 결과는 join-condition이 참인 쌍을 이루는 행, 그리고 쌍을 이루지 않는 T2의 각 행에 대해 T1의 널(NULL) 행과 해당 행의 병합으로 구성됩니다. T1에서 파생된 모든 컬럼에는 널(NULL) 값이 허용됩니다.
- T1 FULL OUTER JOIN T2의 결과는 쌍을 이루는 행과 쌍을 이루지 않는 T2의 각 행에 대해 T1의 널(NULL) 행과 해당 행의 병합 및 쌍을 이루지 않는 T1의 각 행에 대해 T2의 널(NULL)행과 해당 행의 병합으로 구성됩니다. T1 및 T2에서 파생된 모든 컬럼에는 널(NULL) 값이 허용됩니다.
조인 조건
조인 조건은 조인할 두 테이블이 관련된 자격 표현식입니다. t1과 t2의 쌍을 지정하며, 여기서 t1과 t2는 JOIN 연산자의 왼쪽(t1)과 오른쪽(t2) 피연산자 테이블의 이름을 나타냅니다. t1과 t2의 가능한 모든 행 조합에서 join-condition이 참인 경우 t1의 한 행이 t2의 한 행과 쌍을 이룹니다.
- 참조 값이 오브젝트 ID 컬럼이 아닌 다른 값일 경우 비참조 연산 또는 DEREF 함수를 포함할 수 없는 경우
- join-condition 표현식에서 참조된 컬럼이 동일한 joined-table절의 범위에 있는 연관된 조인의 피연산자 테이블 중 하나의 컬럼이어야 하는 경우
- 완전 외부 조인의 join-condition 표현식에서 참조된 함수가 결정적이어야 하고 외부 조치가 없어야 하는 경우
- XMLQUERY 또는 XMLEXISTS 표현식을 포함할 수 없는 경우
조인 결과
- ON <join-condition>
- 이 절에서는 조인할 두 테이블이 관련된 모든 자격
표현식을 지정할 수 있습니다. 예를 들어, 다음과 같습니다.
조인 결과에는 모든 t1 컬럼과 모든 t2 컬럼이 차례로 포함됩니다.SELECT * FROM t1 JOIN t2 ON t1.c1 = t2.c1 AND t1.c2 = t2.c2; - USING <column-list>
- 이 절은 지정된 컬럼의 테이블을 조인합니다. 각 컬럼은 조인될 테이블
모두에 존재합니다. 컬럼의 값이 두 테이블에서 모두 동일한 경우 테이블이 조인됩니다. 예를 들어, 다음과 같습니다.
조인 결과의 컬럼은 조인 유형에 따라 달라집니다.SELECT * FROM t1 JOIN t2 USING (c1, c2);- 내부 조인 또는 왼쪽 외부 조인
- 조인 결과에는 t1의 조인 컬럼, t1의 비조인 컬럼, t2의 비조인 컬럼이 차례로 포함됩니다.
- 오른쪽 외부 조인
- 조인 결과에는 t2의 조인 컬럼, t1의 비조인 컬럼, t2의 비조인 컬럼이 차례로 포함됩니다.
- 완전 외부 조인
- 조인 결과에는 조인 컬럼의 널(NULL)이 아닌 값, t1의 비조인 컬럼, t2의 비조인 컬럼이 차례로 포함됩니다.
CREATE TABLE t1 (c1 int, c2 varchar(10), c3 numeric(4,2));
CREATE TABLE t2 (c1 bigint, c2 char(8), c4 numeric(6,3));
CREATE TABLE t3 (c3 bigint, c5 int, c6 numeric(6,3));
SELECT * FROM t1 FULL JOIN t2 USING (c1, c2) JOIN t3 ON (c1 = t3.c3);
Column projections:
CASE WHEN (t1.c1 IS NOT NULL) THEN t1.c1 ELSE t2.c1 END AS c1
CASE WHEN (t1.c2 IS NOT NULL) THEN t1.c2 ELSE t2.c2 END AS c2
t1.c3
t2.c4
t3.c3
t3.c5
t3.c6
ON절의 컬럼 c1에 대한 참조는
완전 외부 조인의 조인 컬럼 c1을 나타내는 CASE 표현식으로 해석됩니다.
따라서 ON절은 다음으로 변환됩니다.
ON ((CASE WHEN (t1.c1 IS NOT NULL) THEN t1.c1 ELSE t2.c1 END) = t3.c3)
- ON 및 USING 절은 특정 조인 연산에 대해 상호 배타적입니다. 즉, 두 테이블을 조인할 때 이러한 절 중 하나만 지정할 수 있습니다. 그러나 단일 SQL문은 여러 조인 연산을 포함할 수 있으며 그러한 각 조인 연산은 하나의 절을 사용할 수 있습니다.
- ON 또는 USING 절은 더하기 기호(+)가 외부 조인 연산자로 사용되는 경우에는 사용할 수 없습니다.
예
CREATE TABLE t1 (c1 int, c2 varchar(10), c3 numeric(4,2));
CREATE TABLE t2 (c1 bigint, c2 char(8), c4 numeric(6,3));
CREATE TABLE t3 (c3 bigint, c5 int, c6 numeric(6,3));
- ON절을 사용한 조인의 경우:
SELECT * FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 AND t1.c2 = t2.c2; Column projections: t1.c1, t1.c2, t1.c3, t2.c1, t2.c2, t2.c4SELECT * FROM t1 FULL JOIN t2 ON t1.c1 = t2.c1 AND t1.c2 = t2.c2; Column projections: t1.c1, t1.c2, t1.c3, t2.c1, t2.c2, t2.c4 - USING절을 사용한 내부 조인 또는 왼쪽 외부 조인의 경우:
SELECT * FROM t1 INNER JOIN t2 USING (c1, c2); Column projections: t1.c1, t1.c2, t1.c3, t2.c4SELECT * FROM t1 LEFT JOIN t2 USING (c1, c2); Column projections: t1.c1, t1.c2, t1.c3, t2.c4 - USING절을 사용한 오른쪽 외부 조인의 경우:
SELECT * FROM t1 RIGHT JOIN t2 USING (c1, c2); Column projections: t2.c1, t2.c2, t1.c3, t2.c4 - USING절을 사용한 완전 외부 조인의 경우:
SELECT * FROM t1 FULL JOIN t2 USING (c1, c2); Column projections: CASE WHEN (t1.c1 IS NOT NULL) THEN t1.c1 ELSE t2.c1 END AS c1 CASE WHEN (t1.c2 IS NOT NULL) THEN t1.c2 ELSE t2.c2 END AS c2 t1.c3 t2.c4
