우당탕탕 개발일지
[SQL] 프로그래머스 SELECT : 부모의 형질을 모두 가지는 대장균 찾기(level 2) - 2회차 복습 완료 본문
💡문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/301647
- 부모의 형질을 모두 가지는 대장균 찾
💡SQL 코드 설계
부모의 형질을 모두 보유한 대장균의 ID(ID), 대장균의 형질(GENOTYPE), 부모 대장균의 형질(PARENT_GENOTYPE)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 ID에 대해 오름차순 정렬해주세요.
ECOLI_DATA 테이블 두 개를 서로 연결해야 하는데, 이 때 키조건은
PARENT.ID = E.PARENT_ID
그리고 형질 조건을 만족하는지 보기 위해서 비트 연산자를 써야한다!
ED1.GENOTYPE & ED2.GENOTYPE = ED2.GENOTYPE
💡SQL 코드
-- 코드를 작성해주세요
WITH PARENT AS (
SELECT ID, GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA
)
SELECT
E.ID, GENOTYPE, PARENT_GENOTYPE
FROM
ECOLI_DATA AS E
JOIN
PARENT
ON
PARENT.ID = E.PARENT_ID
WHERE
(E.GENOTYPE & PARENT_GENOTYPE) >= PARENT_GENOTYPE
ORDER BY
ID
💡다른 풀이
SELECT
ED1.ID, ED1.GENOTYPE, ED2.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA AS ED1
LEFT JOIN ECOLI_DATA AS ED2
ON ED1.PARENT_ID = ED2.ID
WHERE ED1.GENOTYPE & ED2.GENOTYPE = ED2.GENOTYPE
ORDER BY ED1.ID
나는 ECOLI_DATA 테이블을 두 번 써야 하는데, 어떻게 써야할지 몰라서 WITH문을 사용했다.
그런데 이 풀이에서는 그냥 ED1, ED2로 나눠서 풀었다.
이게 더 깔끔한 것 같다.
앞으로 하나의 테이블을 두 번 써야할 때에는 이렇게 1, 2로 구분해서 쓰자!
그리고 비트 연산자가 너무 어려웠다..처음에는 ED1.GENOTYPE & ED2.GENOTYPE >0인 줄 알았는데
생각해보니 아니었다.
예를 들어 자식이 1번 형질과 3번 형질을 가지고 있고, 부모가 2번 형질과 3번 형질을 가지고 있는 경우 문제대로라면 출력하면 안되지만 ED1.GENOTYPE & ED2.GENOTYPE >0는 만족한다. 즉, 이 부등식이 틀렸다는 소리.
ED1.GENOTYPE & ED2.GENOTYPE = ED2.GENOTYPE
이렇게 등호를 만족해야 한다. 예를 들어 GENOTYPE이 5(=b0101)이고 PARENT_GENOTYPE이 3(=b0011)이면
0101 & 0011 = 0001이므로 포함이 안되고,
GENOTYPE이 13(=b1101)이고 PARENT_GENOTYPE이 5(=b0101)이면 1101 & 0101 = 0101이라 포함된다.
'SQL' 카테고리의 다른 글
[SQL] 프로그래머스 GROUP BY : 언어별 개발자 분류하기 (level 4) - 2회차 복습 완료 (0) | 2024.07.03 |
---|---|
[SQL] 비트연산자 - 2회차 복습 완료 (0) | 2024.07.02 |
[SQL] 프로그래머스 JOIN: 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(level 4) - 2회차 복습 완료 (0) | 2024.07.02 |
[SQL] 프로그래머스 JOIN: 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(level 4) (0) | 2024.07.02 |
[SQL] 프로그래머스 SELECT: 조건에 맞는 개발자 찾기(level 2) (0) | 2024.07.02 |