https://school.programmers.co.kr/learn/courses/30/lessons/301647
[문제]
부모의 형질을 모두 보유한 대장균의 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
'프로그래머스 > My SQL' 카테고리의 다른 글
있었는데요 없었습니다 (0) | 2024.11.23 |
---|---|
없어진 기록 찾기 (0) | 2024.11.22 |
연도별 대장균 크기의 편차 구하기 (0) | 2024.11.21 |
분기별 분화된 대장균의 개체 수 구하기 (0) | 2024.11.20 |
월별 잡은 물고기 수 구하기 (0) | 2024.11.19 |