독특한 Oracle 외부 조인 구문 사례


16

Oracle 외부 조인 구문에서 SQL 표준 외부 조인 구문으로 이식되어야하는 쿼리에서 다음을 보았습니다.

SELECT ...
FROM A, B, C, D, E
WHERE A.A_ID = B.A_ID
AND B.B_ID = C.A_ID(+)
AND B.B_KEY = C.B_KEY(+)
AND C.C_ID = D.C_ID(+)
AND B.A_ID = E.A_ID(+)
AND B.B_KEY = E.B_KEY(+)
AND 'CONSTANT' = C.X_ID(+)

이제 외부 조인 구문을 번역하는 것은 일반적으로 매우 기계적인 과정이지만 마지막 줄은 당황했습니다. 무슨 뜻인가요? 어떤 영향을 미칩니 까?

답변:


11

나는 기계적인 과정을 수행하려고 노력했다. 나는 그것이 올바르게 기억되기를 바랍니다.

이것은 다음으로 이어진다 :

SELECT ...
FROM A
         join B on A.A_ID = B.A_ID
    left join C on B.B_ID = C.A_ID and B.B_KEY = C.B_KEY and 'CONSTANT' = C.X_ID
    left join D on C.C_ID = D.C_ID
    left join E on B.A_ID = E.A_ID and B.B_KEY = E.B_KEY

요컨대 Leigh Riffel의 대답이 맞다고 생각합니다.

노트

옛날에는 암기하는 규칙은 다음과 같습니다. oracle 여기서 Aa = Bb (+)는 Aa * = Bb SQL-Server 이전 구문에서 플러스는 반대쪽으로 가고 별이됩니다. 이는 Aa = Bb의 A 왼쪽 조인 B를 의미합니다


10

행은 c.X_ID가 상수 값과 같거나 C 테이블의 레코드가 없어야합니다. 물론 조인 된 상태이므로 A 테이블의 레코드를 제한하지 않으며 조인되는 C 테이블의 레코드 만 제한합니다. 데모는 다음과 같습니다.

설정:

CREATE TABLE T1 as (select rownum+1 t1_id from dual connect by rownum <= 4);
CREATE TABLE T2 as (
   select rownum t1_id, DECODE(rownum,2,'CONSTANT',3,'NoMatch') CompareField 
   from dual connect by rownum <= 3
);
SELECT * FROM T1;
SELECT * FROM T2;

결과 :

SELECT T1.t1_id, T2.t1_id, T2.CompareField
FROM T1, T2
WHERE T1.t1_id = T2.t1_id(+)
AND 'CONSTANT' = T2.CompareField(+)
ORDER BY 1;

또는:

SELECT T1.t1_id, T2.t1_id, T2.CompareField
FROM T1 LEFT JOIN T2 ON T1.t1_id = T2.t1_id 
AND 'CONSTANT' = T2.CompareField
ORDER BY 1;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.