프로그래머스 SQL

프로그래머스 오랜기간 보호한 동물(1) | ORACLE | 오라클

cosmohoo 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 환경으로 진행하였습니다.

 

반응형