아웃터조인 문의 드립니다.. 1 2 1,308

by 동동동 [SQL Query] [2019.11.28 17:14:33]


--1번
WITH TMP1 AS (
SELECT 'A' CD, 'AA' CD2 FROM DUAL
),
TMP2 AS (
SELECT 'A' CD, '과일' NM FROM DUAL
UNION ALL
SELECT 'B' CD, '야채' NM FROM DUAL
UNION ALL
SELECT 'C' CD, '고기' NM FROM DUAL
),
TMP3 AS (
SELECT 'AA' CD, '사과' NM FROM DUAL
)
SELECT * FROM TMP1, TMP2, TMP3
WHERE TMP1.CD2 = TMP3.CD
AND TMP1.CD(+) = TMP2.CD
;

--2번
WITH TMP1 AS (
SELECT 'A' CD, 'AA' CD2 FROM DUAL
),
TMP2 AS (
SELECT 'A' CD, '과일' NM FROM DUAL
UNION ALL
SELECT 'B' CD, '야채' NM FROM DUAL
UNION ALL
SELECT 'C' CD, '고기' NM FROM DUAL
),
TMP3 AS (
SELECT 'AA' CD, '사과' NM FROM DUAL
)
SELECT * FROM (
SELECT TMP1.CD
     , TMP3.NM
 FROM TMP1, TMP3
WHERE TMP1.CD2 = TMP3.CD
) TMP1, TMP2
WHERE TMP1.CD(+) = TMP2.CD
;

왜 1번은 안되는지 이해가 안되네요...

원하는 결과는 2번 처럼 나오는 겁니다..도움 부탁드립니다..

by 마농 [2019.11.28 18:20:17]

기준이 뭔지 잘 생각해야 합니다.
기준이 tmp2 네요.
여기에 tmp1 과 tmp3 를 아우터조인해야 하는데
tmp3 는 tmp2 와 바로 연결이 안되니 tmp1 을 거쳐서 연결되어야 하네요.
tmp2 > tmp1 > tmp3 순서대로 아우터 조인 해주시면 됩니다.
 

SELECT *
  FROM tmp1
     , tmp2
     , tmp3
 WHERE tmp2.cd  = tmp1.cd(+)    -- (tmp2 -> tmp1)
   AND tmp1.cd2 = tmp3.cd(+)    -- (tmp1 -> tmp3)
;

 


by 동동동 [2019.11.28 18:32:30]

마농님 답글 감사드립니다.

TMP2 는 무조건 다 가져오고, TMP1 하고  TMP3 은 일치하는것만 하려고 했는데..

TMP1 과 TMP3가 아웃터조인이 되어야 한다니...아..오묘하네요..당장은 이해가 안되네요..ㅎ

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입