Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

집 짓는 개발블로그

[프로그래머스] 특정 세대의 대장균 찾기 (MySQL) 본문

MySQL

[프로그래머스] 특정 세대의 대장균 찾기 (MySQL)

취준er 2024. 7. 5. 04:28

https://school.programmers.co.kr/learn/courses/30/lessons/301650

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

정답 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를 바보같이 사용하고 있을 수도(?)