Oracle 쿼리 ㉮와 같은 [결과]를 ANSI 쿼리 ㉯로 얻으려 한다… | [SQLD] SQL 개발자 기출유형 모의고사 10회 상세 페이지
1[SQLD] SQL 개발자 기출유형 모의고사 10회
Oracle 쿼리 ㉮와 같은 [결과]를 ANSI 쿼리 ㉯로 얻으려 한다. ( ㉠ )에 들어갈 구문으로 옳은 것은?[계약]
| 계약번호 | 고객명 | 상태 |
|---|---|---|
| 101 | 김하늘 | 유지 |
| 102 | 이도윤 | 해지 |
| 103 | 박서아 | 유지 |
| 104 | 최로운 | 유지 |
[청구]
| 청구번호 | 계약번호 | 금액 |
|---|---|---|
| 1 | 101 | 120 |
| 2 | 102 | 300 |
| 3 | 103 | 80 |
| 4 | 103 | 50 |
| 5 | 109 | 70 |
㉮
SELECT R.청구번호, C.고객명 FROM 청구 R, 계약 C WHERE C.계약번호(+) = R.계약번호 AND C.상태(+) = '유지' ORDER BY R.청구번호;
㉯
SELECT R.청구번호, C.고객명
FROM 청구 R ( ㉠ ) 계약 C
ON C.계약번호 = R.계약번호
AND C.상태 = '유지'
ORDER BY R.청구번호;[결과]
| 청구번호 | 고객명 |
|---|---|
| 1 | 김하늘 |
| 2 | (null) |
| 3 | 박서아 |
| 4 | 박서아 |
| 5 | (null) |
1
INNER JOIN
2
LEFT OUTER JOIN
3
RIGHT OUTER JOIN
4
CROSS JOIN
해설
(+) 가 붙은 계약 쪽은 짝이 없을 때 NULL 로 채워지는 쪽이므로, 보존할 청구를 왼쪽에 둔 LEFT OUTER JOIN 이 같은 결과를 낸다.
C.상태(+) = '유지'처럼 (+) 가 붙은 조건은 ON 절 조건이 되어, 해지 계약의 청구 2와 계약이 없는 청구 5도 고객명 NULL 로 남는다.
- RIGHT OUTER JOIN 은 계약을 보존해 102·104가 청구 NULL 로 나오고 청구 2·5는 빠진다.
- INNER JOIN 은 짝이 맞는 청구 세 건만 남겨 NULL 행이 사라진다.
- CROSS JOIN 은 조건 없이 모든 행을 곱하는 구문이라 ON 절을 붙이면 오류가 난다.
오류나 개정된 내용이 보이면 알려주세요