Coding Planet
[SQLD] 노랭이 66번 풀이 - EXISTS, NOT EXISTS, RIGHT OUTER JOIN, LEFT OUTER JOIN 본문
DB, SQL
[SQLD] 노랭이 66번 풀이 - EXISTS, NOT EXISTS, RIGHT OUTER JOIN, LEFT OUTER JOIN
jhj.sharon 2023. 9. 3. 17:31반응형
| EXISTS, NOT EXISTS
EXISTS(서브쿼리)는 서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건이다. 만약 한 건이라도 존재하는 경우에는 TRUE 없으면 FALSE를 반환한다. EXISTS는 서브 쿼리에 일치하는 경우가 한 건이라도 있으면 쿼리를 더 이상 수행하지 않는다.
NOT EXISTS(서브쿼리)는 이와는 반대로 서브쿼리의 결과를 만족하는 값이 한 건이라도 존재하는 경우 FALSE 존재하지 않는 경우 TRUE이다.
| RIGHT OUTER JOIN, LEFT OUTER JOIN
RIGHT OUTER JOIN은 아우터 조인에서 사용하는 방법 중 하나이며 RIGHT JOIN으로 부르기도 한다. RIGHT OUTER JOIN은 두번째(오른쪽) 테이블의 모든 레코드와 첫 번째 (왼쪽)테이블이 일치하는 레코드를 매핑하여 반환한다. 만약 첫번째 테이블에 일치하는 레코드가 없는 경우, 결과에는 두번째 테이블의 레코드와 함께 NULL이 반환된다. 즉 RIGHT OUTER JOIN은 오른쪽 테이블이 기준이고 LEFT OUTER JOIN은 왼쪽 테이블이 전체출력되는 기준인 것이다.
Q66. 다음 중 아래 데이터 모델을 참고하여 설명에 맞게 올바르게 작성한 SQL문장을 2개 고르시오. [설명] 우리는 매일 배치작업을 통하여 고객에게 추천할 컨텐츠를 생성하고 고객에게 추천서비스를 제공한다. 추천 컨텐츠가 엔터티에서 언제 추천을 해야 하는지를 정의하는 추천대상일자가 있어 해당일자에만 컨텐츠를 추천해야 한다. 또한 고객이 컨텐츠를 추천 받았을 때 선호하는 컨텐츠가 아닌 경우에는 고객이 비선호 컨텐츠로 분류하여 더 이상 추천받기를 원하지 않는다. 그러므로 우리는 비선호 컨텐츠 엔티티에 등록된 데이터에 대해서는 추천을 수행하지 않아야 한다. |
① SELECT C.컨텐츠ID, C.컨텐츠명 FROM 고객 A INNER JOIN 추천콘텐츠 B ON (A.고객ID = B.고객ID) INNER JOIN 컨텐츠 C ON (B.컨텐츠ID = C.컨텐츠ID) WHERE A.고객ID = #custID# AND B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD') AND NOT EXISTS (SELECT X.컨텐츠ID FROM 비선호컨텐츠 X WHERE X.고객ID = B.고객ID); ② SELECT C.컨텐츠ID, C.컨텐츠명 FROM 고객 A INNER JOIN 추천콘텐츠 B ON (A.고객ID = #custID# AND A.고객ID = B.고객ID) INNER JOIN 컨텐츠 C ON (B.컨텐츠ID = C.컨텐츠ID) RIGHT OUTER JOIN 비선호컨텐츠 D ON (B.고객ID = D.고객ID AND B.컨텐츠ID = D.컨텐츠ID) WHERE B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD') AND B.컨텐츠ID IS NOT NULL; ③ SELECT C.컨텐츠ID, C.컨텐츠명 FROM 고객 A INNER JOIN 추천콘텐츠 B ON (A.고객ID = B.고객ID) INNER JOIN 컨텐츠 C ON (B.컨텐츠ID = C.컨텐츠ID) RIGHT OUTER JOIN 비선호컨텐츠 D ON (B.고객ID = D.고객ID AND B.컨텐츠ID = D.컨텐츠ID) WHERE A.고객ID = #custID# AND B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD') AND D.컨텐츠ID IS NULL; ④ SELECT C.컨텐츠ID, C.컨텐츠명 FROM 고객 A INNER JOIN 추천콘텐츠 B ON (A.고객ID = #custID# AND A.고객ID = B.고객ID) INNER JOIN 추천콘텐츠 B ON (B.컨텐츠ID = C.컨텐츠ID) WHERE B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD') AND NOT EXISTS (SELECT X.컨텐츠ID FROM 비선호컨텐츠 X WHERE X.고객ID = B.고객ID AND X.컨텐츠ID = B.컨텐츠ID) |
- ①번 : 오답
- NOT EXISTS (SELECT X.컨텐츠ID FROM 비선호컨텐츠 X WHERE X.고객ID = B.고객ID);
- 위 서브쿼리에서 비선호 컨텐츠에 바인드변수처리된 고객번호가 하나라도 있을 경우 NOT EXISTS 절은 FALSE를 반환하게 되어 단 하나의 컨텐츠라도 비선호로 등록한 고객에 대해서는 모든 컨텐츠가 추천에서 배재된다.
- 즉, 해당 고객에게 추천되는 모든 컨텐츠 행에 대해 NOT EXIST 조건이 FALSE를 반환하게 되어 해당 고객에 대한 모든 추천 컨텐츠가 검색 결과에서 제외되게 된다.
- 이를 방지하기 위해서는 서브쿼리내에 AND X.컨텐츠ID = B.컨텐츠ID를 추가해야한다.
- ②번 : 오답
- ON (B.컨텐츠ID = C.컨텐츠ID) RIGHT OUTER JOIN 비선호컨텐츠 D
- RIGHT OUTER JOIN의 경우 오른쪽의 테이블이 전체 출력되고 왼쪽 테이블의 경우 오른쪽 테이블과 매핑이 되는 데이터만 출력된다. 매핑이 되지 않는 칸은 NULL로 채워진다.
- 따라서 이 쿼리문은 정확히 비선호 컨텐츠만 출력이 된다.
- 고객이 비선호로 등록하지 않은 컨텐츠는 추천컨텐츠에만 등록 되어 있으므로 매핑이 될 수 없다.
- ③, ④번 : 정답
- 위 오답과 비슷한 논리로 비교가능
반응형
'DB, SQL' 카테고리의 다른 글
[SQLD]빈출 서브쿼리, 집합연산자, 합계 연산자 총정리(예시포함) (0) | 2023.09.05 |
---|---|
[SQLD] 노랭이 87번 풀이 - START WITH...CONNECT BY PRIOR (3) | 2023.09.04 |
[SQLD] 단일행 NULL관련 함수들(NVL, ISNULL, NULLIF, COALESCE) (0) | 2023.09.03 |
[SQLD] CASE 표현식 : SEARCHED CASE와 SIMPLE CASE - 노랭이 43번 (0) | 2023.09.01 |
[SQLD] SQL 자격검정 실전문제(노랭이) - 41번 문제 풀이 (0) | 2023.09.01 |
Comments