문제 설명
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다. 최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.
Column name | Type | Nullable |
ID | INTEGER | FALSE |
PARENT_ID | INTEGER | TRUE |
SIZE_OF_COLONY | INTEGER | FALSE |
DIFFERENTIATION_DATE | DATE | FALSE |
GENOTYPE | INTEGER | FALSE |
문제
부모의 형질을 모두 보유한 대장균의 ID(ID), 대장균의 형질(GENOTYPE), 부모 대장균의 형질(PARENT_GENOTYPE)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 ID에 대해 오름차순 정렬해주세요.
정답
SELECT
A.ID,
A.GENOTYPE,
B.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA AS A
LEFT JOIN ECOLI_DATA AS B
ON A.PARENT_ID = B.ID
WHERE A.GENOTYPE & B.GENOTYPE = B.GENOTYPE
ORDER BY ID;
풀이
이전에 풀었던 비트 연산 문제에 JOIN이 추가된 내용 이였다. 이전 비트연산문제의 경우 특정 형질을 찾는 문제라 비트연산자 '&'와 숫자를 사용했다면 이번에는 부모의 형질을 모두 보유한 경우이기 때문에 JOIN을 이용해 A, B 로 나누어 A테이블에 있는 부모 ID와 B테이블의 ID가 같다고 정의한 뒤, WHERE절에서 A.GENOTYPE 즉 A형질과 B.GENOTYPE B형질이 같을 경우 ORDER BY ID; ID순으로 오름차순 정렬하는 쿼리로 마무리 되었다.
이 문제같은 경우에도 이전 문제와 동일하게 각 대장균별 형질을 2진수로 나타낸 예시가 있었지만 사실 이번 문제에서 2진수를 통한 계산이 따로 필요 없이 JOIN을 이용해 풀 수 있어서 조금 혼란스러운 문제였던 것 같다. 비트연산이 익숙하지 않아 조금 더 꼬아서 생각하다보니 PARENT_ID Column과 ID Column이 예시에 나와있어 힌트가 되었던 것 같다.
'SQL' 카테고리의 다른 글
[프로그래머스/MySQL] 분기별 분화된 대장균의 개체 수 구하기 (0) | 2024.08.02 |
---|---|
[프로그래머스/MySQL] 연도별 대장균의 편차 구하기 (0) | 2024.07.31 |
[프로그래머스/MySQL] 모든 레코드 조회하기 (0) | 2024.07.25 |
[프로그래머스/MySQL] 여러 기준으로 정렬하기 (3) | 2024.07.24 |
[프로그래머스/MySQL] 상위 n개 레코드 (3) | 2024.07.22 |