안시 조인 조건에대해서 질문드립니다. 0 4 563

by 겸둥이k [Oracle 기초] [2021.11.17 08:59:08]


안녕하세요. 안시 조인에 대해서 궁금한점이 있습니다.

SELECT
*
FROM 
TEMP_TEST1 A
LEFT OUTER JOIN  TEMP_TEST2 B ON 
A.SEQ=B.SEQ
--AND B.SEQ='144'
WHERE
--B.SEQ='144'

 

ON절에 seq  조건을 넣는것과 where절에 넣은것과 다른 뜻을 가진 조건인가요?

 

 

by 우주민 [2021.11.17 09:05:22]

on 절에 넣으면 b.seq = '144' 항목을 먼저 필터링 한 후에 left join 을 합니다.

where 절에 넣으면 join을 먼저 하고 b.seq = '144' 조건을 필터링 합니다.

 

on -> outer join 할 테이블의 조건( b 테이블이 seq = '144' 인 값들이 아우터 조인 됨)

where -> join 후 데이터 필터링할 조건( b 테이블이 seq = '144' 인 값들만 출력 됨)


by 마농 [2021.11.17 09:09:37]

1. 조건절 의미
- ON 절 : 조인 조건
- WHERE : 검색 조건(필터 조건)
2. 조건 위치에 따른 결과 차이
- 이너 조인의 경우 결과에 차이는 없으나 의미에 맞는 위치에 조건을 주는게 좋습니다.
- 아우터 조인의 경우 결과에 차이가 있습니다.
3. 위 예시에서의 차이 설명
- 아우터 조인은 B 와의 조인이 실패하더라도 A 는 다 나오게 됩니다.
- ON b.seq = 144 는 144 인 것만 조인한다는 의미이고 조인에 실패해도 A 는 다 나옵니다.
- WHERE b.seq = 144 는 144 인 것만 조회한다는 의미가 됩니다. 아우터 조인이 무의미해 지겟네요.

WITH temp_test1 AS
(
SELECT 143 seq FROM dual
UNION ALL SELECT 144 FROM dual
UNION ALL SELECT 145 FROM dual
)
, temp_test2 AS
(
SELECT 143 seq FROM dual
UNION ALL SELECT 144 FROM dual
)

-- Test 1 : 조건 없음--
SELECT *
  FROM temp_test1 a
  LEFT OUTER JOIN temp_test2 b
    ON a.seq = b.seq
;
SELECT *
  FROM temp_test1 a
     , temp_test2 b
 WHERE a.seq = b.seq(+)
;
-- Test 1 --
143	143
144	144
145	null


-- Test 2 : On 절 조건--
SELECT *
  FROM temp_test1 a
  LEFT OUTER JOIN temp_test2 b
    ON a.seq = b.seq
   AND b.seq = 144
;
SELECT *
  FROM temp_test1 a
     , temp_test2 b
 WHERE a.seq = b.seq(+)
   AND b.seq(+) = 144
;
-- Test 2 --
143	null
144	144
145	null


-- Test 3 : Where 절 조건 --
SELECT *
  FROM temp_test1 a
  LEFT OUTER JOIN temp_test2 b
    ON a.seq = b.seq
 WHERE b.seq = 144
;
SELECT *
  FROM temp_test1 a
     , temp_test2 b
 WHERE a.seq = b.seq(+)
   AND b.seq = 144
;
-- Test 3 --
144	144

 


by 겸둥이k [2021.11.17 09:32:08]

답변감사합니다. 

이해가 안되는점이 

WHERE 절에 B 테이블에 144 인 것만 조회한다는 의미가  A 드라이빙 테이블 기준 lete 조인을 무시하고  b테이블 144인것만 가져온다는말인가요?


by 겸둥이k [2021.11.17 09:43:50]

감사합니다. 예제로 이해가 되었습니다.

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