ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 오랜기간 보호한 동물(1) | ORACLE | 오라클
    프로그래머스 SQL 2022. 1. 12. 11:26
    반응형

    문제설명

     

    *ORACLE 환경으로 진행하였습니다.

     

    예시

    예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면

    ANIMAL_INS

    ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE

    A354597 Cat 2014-05-02 12:16:00 Normal Ariel Spayed Female
    A373687 Dog 2014-03-20 12:31:00 Normal Rosie Spayed Female
    A412697 Dog 2016-01-03 16:25:00 Normal Jackie Neutered Male
    A413789 Dog 2016-04-19 13:28:00 Normal Benji Spayed Female
    A414198 Dog 2015-01-29 15:01:00 Normal Shelly Spayed Female
    A368930 Dog 2014-06-08 13:20:00 Normal   Spayed Female

    ANIMAL_OUTS

    ANIMAL_IDANIMAL_TYPEDATETIMENAMESEX_UPON_OUTCOME

    A354597 Cat 2014-05-02 12:16:00 Ariel Spayed Female
    A373687 Dog 2014-03-20 12:31:00 Rosie Spayed Female
    A368930 Dog 2014-06-13 15:52:00   Spayed Female

    SQL문을 실행하면 다음과 같이 나와야 합니다.

    NAMEDATETIME

    Shelly 2015-01-29 15:01:00
    Jackie 2016-01-03 16:25:00
    Benji 2016-04-19 13:28:00

    ※ 입양을 가지 못한 동물이 3마리 이상인 경우만 입력으로 주어집니다.

     

     

    -- 코드를 입력하세요
    SELECT * 
    FROM
        (
        SELECT NAME, DATETIME
        FROM  ANIMAL_INS 
        WHERE 1=1 
        AND ANIMAL_ID NOT IN (SELECT A.ANIMAL_ID
                              FROM ANIMAL_INS A, ANIMAL_OUTS B
                              WHERE A.ANIMAL_ID = B.ANIMAL_ID
                             )
        ORDER BY 2 ASC
        )
    WHERE 1=1
    AND ROWNUM <4;

     

    => NOT IN을 이용한 쿼리입니다. 

    => 입양을 가지 못한 동물의 경우 ANIMAL_OUTS에 존재할 수 없습니다. 

    => 해당 성질을 이용해 INS와 OUTS을 이용해 입양을 간 동물들의 ANIMAL_ID를 구해냅니다. 이후, 해당 값을 안 가진 녀석들은 INS에서 찾아 보여주면 됩니다. 

    => ROWNUM에 대한 제한은 인라인뷰를 활용하여 풀었습니다. ROWNUM을 서브 쿼리 안에서 돌릴 경우, 틀렸다고 나옵니다. 

     

    -- 코드를 입력하세요
    
        SELECT NAME, DATETIME
        FROM  ANIMAL_INS 
        WHERE 1=1 
        AND ANIMAL_ID NOT IN (SELECT A.ANIMAL_ID
                              FROM ANIMAL_INS A, ANIMAL_OUTS B
                              WHERE A.ANIMAL_ID = B.ANIMAL_ID
                             )
        AND ROWNUM <4
        ORDER BY 2 ASC
        
        );

    => 위와같이 할 경우 틀린 쿼리문입니다. 

     

    SELECT *
    FROM (SELECT a.NAME, a.DATETIME
          FROM ANIMAL_INS a LEFT JOIN ANIMAL_OUTS b ON a.ANIMAL_ID = b.ANIMAL_ID
          WHERE b.ANIMAL_ID IS NULL
          ORDER BY a.DATETIME
         )
    WHERE ROWNUM < 4;

    => 이와 같이 LEFT JOIN을 활용하여 표현할 수 도 있습니다. 

    => 하나의 답만 있는 것이 아니므로 본인이 원하는 쿼리를 짜시고 사용하시면 됩니다. 

     

     

     

    *ORACLE 환경으로 진행하였습니다.

     

    반응형

    댓글

Designed by Who.