ECOLI_DATA 테이블에서 부모의 형질을 모두 보유한 자식 대장균의 ID, 자신의 GENOTYPE, 부모의 GENOTYPE을 ID 오름차순으로 조회하는 문제이다.
| 테이블 | 주요 컬럼 |
|---|---|
ECOLI_DATA | ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE |
PARENT_ID는 부모 개체의 ID를 나타내며, 최초 개체의 PARENT_ID는 NULL이다.
문제를 읽고 핵심 조건을 먼저 정리해보았다.
자식
GENOTYPE & 부모 GENOTYPE = 부모 GENOTYPE
& 연산 결과가 부모 GENOTYPE과 같다는 것은, 부모가 가진 형질 비트가 자식 GENOTYPE 안에 모두 포함되어 있다는 의미이다.
부모 GENOTYPE = 5 → 0101 (1번, 3번 형질)
자식 GENOTYPE = 7 → 0111 (1번, 2번, 3번 형질)
자식 & 부모 = 0111 & 0101 = 0101 = 5 (= 부모) ✅ → 부모 형질 모두 보유
자식 GENOTYPE = 6 → 0110
자식 & 부모 = 0110 & 0101 = 0100 = 4 (≠ 부모) ❌ → 부모 형질 일부 미보유
ECOLI_DATA 테이블에는 PARENT_GENOTYPE 컬럼이 따로 없다. 부모의 GENOTYPE을 가져오려면 자식의 PARENT_ID로 같은 테이블에서 부모 행을 찾아야 한다. 즉 같은 테이블을 두 번 JOIN하는 셀프 조인이 필요하다.
FROM ECOLI_DATA C -- 자식
JOIN ECOLI_DATA P -- 부모
ON C.PARENT_ID = P.ID -- 자식의 PARENT_ID = 부모의 ID
이렇게 연결하면 C는 자식 행, P는 부모 행으로 각각의 GENOTYPE을 가져올 수 있다. 여기에 비트 조건을 WHERE절에 추가하면 된다.
구체적으로 정리한 풀이 흐름:
ECOLI_DATA를 C(자식), P(부모)로 셀프 조인ON C.PARENT_ID = P.ID로 부모-자식 연결WHERE (C.GENOTYPE & P.GENOTYPE) = P.GENOTYPE으로 부모 형질 모두 보유한 자식 필터ORDER BY C.ID 오름차순 정렬SELECT C.ID, C.GENOTYPE, P.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA C
JOIN ECOLI_DATA P ON C.PARENT_ID = P.ID
WHERE (C.GENOTYPE & P.GENOTYPE) = P.GENOTYPE
ORDER BY C.ID