집 짓는 개발블로그
[프로그래머스] 특정 세대의 대장균 찾기 (MySQL) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/301650
정답 1
WITH ANCESTOR AS (
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
),
SECONDS AS (
SELECT ECOLI_DATA.ID
FROM ECOLI_DATA INNER JOIN ANCESTOR ON ECOLI_DATA.PARENT_ID = ANCESTOR.ID
)
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IN (SELECT * FROM SECONDS)
ORDER BY ID;
이렇게 풀었더니 테스트 케이스를 엄청나게 느리게 통과하는 게 눈에 보였다.
정답 2
WITH ANCESTOR AS (
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
),
SECONDS AS (
SELECT ECOLI_DATA.ID
FROM ECOLI_DATA INNER JOIN ANCESTOR ON ECOLI_DATA.PARENT_ID = ANCESTOR.ID
)
SELECT ID
FROM ECOLI_DATA E
WHERE EXISTS (SELECT * FROM SECONDS WHERE E.PARENT_ID = SECONDS.ID)
ORDER BY ID;
그 사이에 EXISTS 사용법을 싹 까먹어서 헤맸다.
EXISTS는 메인 쿼리부터 접근하기 때문에, 메인 쿼리에서 지정한 Alias를 바로 사용할 수 있다.
EXISTS에 사용되는 서브쿼리에서 두 개의 테이블에서 일치하는 값을 골라내려면
① 메인 쿼리에서 메인으로 사용하는 테이블의 Alias를 지정하고 (그냥 편하니까)
② 서브쿼리에서는 FROM 옆에는 다른 테이블을 쓰고 ③ 서브쿼리의 WHERE절에서 원하는 두 값을 비교하면 편하다.
일반적으로 EXISTS가 IN보다 더 빠른데, 이 문제에서는 정답이 나오는 속도의 차이가 체감되지는 않았다. 두 쿼리 다 느렸다. 내가 EXISTS를 바보같이 사용하고 있을 수도(?)
'MySQL' 카테고리의 다른 글
[프로그래머스] 재구매가 일어난 상품과 회원 리스트 구하기 (MySQL) - 2개 이상의 분류로 GROUP BY하기 (0) | 2024.08.13 |
---|---|
[프로그래머스] 입양 시각 구하기(2) (MySQL) - WITH RECURSIVE CTE (0) | 2024.07.05 |
[프로그래머스] 이름에 el이 들어가는 동물 찾기 (MySQL) - LIKE, INSTR, LOCATE (0) | 2024.07.05 |
[프로그래머스] 특정 물고기를 잡은 총 수 구하기 (MySQL) (0) | 2024.06.27 |
(MySQL) Alias 그리고 따옴표(' ', " ") (1) | 2024.06.27 |