프로그래머스/My SQL

부모의 형질을 모두 가지는 대장균 찾기

싱싱한복초이 2024. 11. 21. 15:33

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

[문제]

부모의 형질을 모두 보유한 대장균의 ID(ID), 대장균의 형질(GENOTYPE), 부모 대장균의 형질(PARENT_GENOTYPE)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 ID에 대해 오름차순 정렬해주세요.

 

[나의 풀이]

SELECT 
B.ID, 
B.GENOTYPE, 
A.GENOTYPE PARENT_GENOTYPE
FROM ECOLI_DATA B
LEFT JOIN ECOLI_DATA A
ON B.PARENT_ID = A.ID
WHERE 
A.GENOTYPE IS NOT NULL AND (B.GENOTYPE & A.GENOTYPE) = A.GENOTYPE
ORDER BY ID;

 

1. LEFT JOIN

-ECOLI_DATA 테이블을 자기 자신과 조인하여 PARENT_ID 기준으로 부모의 GENOTYPE을 가져옴

-조인한 결과로 PARENT_GENOTYPE을 구함

 

 

2. WHERE절

-부모가 없는 개체는 제외하기 위해 A.GENOTYPE IS NOT NULL 조건을 추가

- B.GENOTYPE & A.GENOTYPE = A.GENOTYPE을 통해 자식 개체가 부모 형질을 모두 보유했는지 확인

 

3. ORDER BY

결과를 ID기준으로 오름차순 정렬

 

[다른 풀이]

 

1.INNER JOIN을 이용한 경우

SELECT CHILD.ID as ID, CHILD.GENOTYPE as GENOTYPE, PARENT.GENOTYPE as PARENT_GENOTYPE
FROM ECOLI_DATA as CHILD
INNER JOIN ECOLI_DATA as PARENT
ON CHILD.PARENT_ID = PARENT.ID
WHERE (CHILD.GENOTYPE & PARENT.GENOTYPE) = PARENT.GENOTYPE
ORDER BY ID ASC;

별칭을 CHILD와 PARENT로 하여 더 직관적인 해석 가능

 

2.서브쿼리를 이용한 경우

SELECT 
    C.ID as ID, 
    C.GENOTYPE as GENOTYPE, 
    (SELECT P.GENOTYPE 
     FROM ECOLI_DATA P 
     WHERE C.PARENT_ID = P.ID) as PARENT_GENOTYPE
FROM 
    ECOLI_DATA C
WHERE 
    (C.GENOTYPE & (SELECT P.GENOTYPE 
                   FROM ECOLI_DATA P 
                   WHERE C.PARENT_ID = P.ID)) = (SELECT P.GENOTYPE 
                                                 FROM ECOLI_DATA P 
                                                 WHERE C.PARENT_ID = P.ID)
ORDER BY 
    C.ID ASC;

SELECT를 여러번 중첩하게 되면 효율이 떨어져 위의 코드들이 낫지 않나 싶다

 

-출처

https://passionfruit200.tistory.com/1138

 

[SQL][프로그래머스] 부모의 형질을 모두 가지는 대장균 찾기 - INNER JOIN + BIT(&) MYSQL

https://school.programmers.co.kr/learn/courses/30/lessons/301647 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞

passionfruit200.tistory.com