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로 채워진다.
  • 따라서 이 쿼리문은 정확히 비선호 컨텐츠만 출력이 된다. 
  • 고객이 비선호로 등록하지 않은 컨텐츠는 추천컨텐츠에만 등록 되어 있으므로 매핑이 될 수 없다.

 

- ③, 번 : 정답

  • 위 오답과 비슷한 논리로 비교가능
반응형
Comments