OUTER JOIN을 사용하여 없는것을 구하는 문제이다.

어제 풀어본 경험을 토대로 쉽게 풀었다.

SELECT O.ANIMAL_ID, O.NAME 
 FROM ANIMAL_INS I RIGHT OUTER JOIN ANIMAL_OUTS O ON(I.ANIMAL_ID = O.ANIMAL_ID)
 WHERE I.ANIMAL_ID IS NULL
 ORDER BY O.ANIMAL_ID;

INNER JOIN 을 사용해서 푸는 문제이다.

INNER JOIN 은 익숙하기 때문에 따로 설명은 하지 않겠다.

다만 DATETIME 의 차이를 구할 때, 형태가 다르다면 TO_CHAR로 형태를 맞추고 같다면 바로 빼주면 된다.

기본단위는 일 이며 시간이 추가되면 소숫점이 나오므로 ROUND나 CEIL, TRUNC를 사용하여 처리해야한다.

 

SELECT * FROM (
    SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_INS I, ANIMAL_OUTS O 
    WHERE I.ANIMAL_ID = O.ANIMAL_ID ORDER BY O.DATETIME - I.DATETIME DESC
) WHERE ROWNUM <= 2;

 

JOIN을 이용하여 조건을 만족하지 않는 값을 조회하는 문제다.

innter join만 써봤기 때문에 못 풀었고 outer join에 공부하고 풀었다.

outer join에 대해 설명하자면 left join, right join이 있다.

left join은 왼쪽에 오른쪽 테이블을 붙히는 형식으로

만약 ON의 조건을 만족하지 못한다면 오른쪽 테이블의 조건 col 은 NULL이 된다.

형식은 FROM A LEFT (OUTER) JOIN B ON(condition) 이다.

right join은 오른쪽 테이블에 왼쪽이 붙으며 비슷하므로 하나만 잘 알면 될 것 같다.

이를 이용하여 WHERE을 이용해 B가 null 인 것을 선택하면 조건이 아닌 테이블을 만들게 되는 것 이다.

SELECT * FROM (
    SELECT I.NAME AS NAME, I.DATETIME AS DATETIME 
    FROM ANIMAL_INS I LEFT OUTER JOIN ANIMAL_OUTS O ON (I.ANIMAL_ID = O.ANIMAL_ID)
    WHERE O.ANIMAL_ID IS NULL ORDER BY I.DATETIME ASC
    )
    WHERE ROWNUM <= 3;

가장 복잡했던 문제였다.

EXTRACT를 사용해 Month를 따로 만들어 준 후 WHERE로 조회 하면 된다.

다만 문제에 오류가 있는것 같다.

주어진 DATE_OF_BIRTH는 DATE 라고 주어져 있으나 DATE가 아니라 DATETIME인것 같다.

따라서 DATE로 바꿔주었다.

SELECT MEMBER_ID, MEMBER_NAME, GENDER, TO_CHAR(DATE_OF_BIRTH, 'YYYY-MM-DD') AS DATE_OF_BIRTH
         FROM (SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_OF_BIRTH, 
               EXTRACT(MONTH FROM CAST(DATE_OF_BIRTH AS DATE)) AS M FROM MEMBER_PROFILE 
               WHERE TLNO IS NOT NULL AND GENDER = 'W')
         WHERE M = 3 ORDER BY MEMBER_ID;

MAX를 이용하여 조회하는 문제이다.

다만 조건에 MAX가 있어야 했다.

따라서 SELECT를 한번 더 해서 WHERE을 통해 출력했다.

다만 중복이 없다는 조건이 있었으면 내림차순으로 정렬한 후, ROWNUM = 1을 사용해서 풀었을것 이다.

SELECT * FROM FOOD_PRODUCT WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);

+ Recent posts