본문 바로가기
Problem Solving/프로그래머스 SQL

[프로그래머스 SQL] 보호소에서 중성화한 동물

by Libi 2021. 8. 11.
반응형

https://programmers.co.kr/learn/courses/30/lessons/59045#fn1

 

코딩테스트 연습 - 보호소에서 중성화한 동물

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

[ 문제풀이 ]

두 테이블이 주어졌을 때 JOIN을 활용하여 원하는 데이터를 추출할 수 있는지 묻는 문제이다.

굉장히 많은 방법이 존재하지만 나는 정답이 가능한 테이블을 서브 쿼리를 통해 미리 추출한 후 JOIN을 하였다.

내 계산 방법이 정확한 건지는 모르겠지만 만약 두 테이블의 튜플이 각각 1만 개라고 할 경우 두 테이블을 JOIN 한 후 WHERE 절을 통해 조건을 비교하는 것보다 테이블을 정답 가능성 높은 것들로만 추출하여 튜플 수를 줄인 후 JOIN을 하는 것이 더 효율성이 높다고 생각하였다.

ANIMAL_INS, ANIMAL_OUTS 두 테이블 각각 튜플 1만개라고 가정

-- JOIN 후 WHERE 절을 통해 비교 --
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS AS I
JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE LIKE 'Intact%' AND O.SEX_UPON_OUTCOME NOT LIKE 'Intact%'
ORDER BY I.ANIMAL_ID ASC;

이 방법은 결국 JOIN 과정에서 1만 X 1만개의 튜플을 비교해야하기 때문에 효율이 별로

-- SubQuery로 두 테이블을 축소한 후 JOIN --
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM (SELECT ANIMAL_ID, ANIMAL_TYPE, NAME
      FROM ANIMAL_INS 
      WHERE SEX_UPON_INTAKE LIKE 'Intact%') AS I
JOIN (SELECT ANIMAL_ID, ANIMAL_TYPE, NAME
      FROM ANIMAL_OUTS
      WHERE SEX_UPON_OUTCOME NOT LIKE 'Intact%') AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY I.ANIMAL_ID ASC; 

이 방법은 JOIN 과정에서 각 테이블의 비교할 튜플의 수가 1만보다 작기 때문에 효율적임

 

 

반응형

댓글