만약 A, B 두개의 테이블이 있고 컬럼은 ID, DEPT, PAT 이 있다고 가정하겠습니다. PK는 둘다 ID인데 , DEPT와 PAT 컬럼이 A 테이블은 필수(NOT NULL), B 테이블은 필수가 아닙니다 (NUL 값 존재) 이상황에서 아우터 조인을 걸때 오라클 조인은 아래와 같이 작성하게 됩니다. SELECT A.ID, A.PAT, A.DEPT FROM A, B WHERE A.ID = B.ID AND A.PAT = B.PAT(+) AND A.DEPT= B.DEPT(+) 만약 ANSI 조인으로 작성하게 되면 이게 맞나요!?
SELECT A.ID, A.PAT, A.DEPT FROM A LEFT OUTER JOIN B ON A.ID = B.ID AND A.PAT = B.PAT AND A.DEPT = B.DEPT ;
아니면 이게 맞나요?
SELECT A.ID, A.PAT, A.DEPT FROM A LEFT OUTER JOIN B ON A.ID = B.ID WHERE A.PAT = B.PAT AND A.DEPT = B.DEPT ;
제가 항상 오라클 조인으로만 쓰다보니 ANSI 조인이 햇깔리네요....
ANSI 조인에서 아래의 쿼리중 FROM 절에 들어가는
FROM A LEFT OUTER JOIN B ON A.ID = B.ID
이부분의 조인 조건과
WHERE 절에 들어가는
WHERE A.PAT = B.PAT AND A.DEPT = B.DEPT ;
이부분의 조인 조건의 차이점이 무엇인가요!?
아래 쿼리에서 Id = id 만 (+) 를 빼고 조회하는 게 의미가 없어요. (+) 가 전부 있거나 없거나 해야 합니다.
아래 조건은 inner join으로 풀립니다. (+) 가 없는 것과 같은 결과라는 의미입니다.
SELECT A.ID, A.PAT, A.DEPT
FROM A, B
WHERE A.ID = B.ID
AND A.PAT = B.PAT(+)
AND A.DEPT= B.DEPT(+)
아하! 제가 잘못 알고 있었군요! 답변감사드립니다!!
일단. 원래의 오라클 구문은 아우터 조인이 무의미한 구문입니다. 이너조인 이라고 보시면 됩니다.
ANSI로 표현된 두개의 구문 중 1번은 아우터 조인이고, 2번은 아우터조인이 무의미한 구문입니다.
즉, 2번 구문이 똑같은 구문이긴 합니다.
다만, 원래 구문이 틀린 구문이고, 그걸 그대로 틀린 구문입니다.
구문만으로는 맞다?.틀리다? 를 논 할 수 없습니다.
뭐가 맞는지는 원하는게 뭔지에 따라 달라집니다.
원하는게 뭔지를 정확하게 알아야 합니다.
아~~
친절하신 설명 정말 감사드립니다!!
좋은하루 되세용!