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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드설명

INNER JOIN + BIT(&) 연산 문제입니다.

 

주어진 테이블을 INNER JOIN하여 자식과 부모관계를 맺고있는 테이블을 새로 만들어냅니다.

그리고, BIT 연산을 통해 PARENT.GENOTYPE과 일치하는 값을 가져옵니다.

 

처음에 틀렸었던 부분은,  아래의 1 입니다.

...
WHERE (CHILD.GENOTYPE & PARENT.GENOTYPE) = 1
...

위와 같이 처리한다면,

부모 PARENT.GENOTYPE이 3으로써  11(2진수) 일때,

자식 CHILD.GENOTYPE이 5으로써 101(2진수) 라면,

11 & 101 = 001(2진수) 이 나올 것 입니다. 그렇게 된다면, 10진수로는 1이 나오고, 1이 일치하기에 원하지 않는 데이터도 나옵니다.

 

그렇기에 아래와 같이 설정하여 PARENT.GENOTYPE(형질)을 모두 가지고 있을때만 작동하도록 합니다.

WHERE (CHILD.GENOTYPE & PARENT.GENOTYPE) = PARENT.GENOTYPE

 

INNER JOIN 을 사용하지 않고 SUBQUERY를 사용할시 중복된 쿼리가 반복해서 연산되므로 INNER JOIN을 사용해서 처리합니다.

 

또, 문제에서 ALIAS로 CHILD TABLE과 PARENT TABLE을 분리해서 데이터를 표현해면 더 편리합니다.

코드

INNER JOIN을 활용한 코드입니다.

SELECT ED1.ID, ED1.GENOTYPE, ED2.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA AS ED1
INNER JOIN ECOLI_DATA AS ED2
ON ED1.PARENT_ID = ED2.ID
WHERE ED1.GENOTYPE & ED2.GENOTYPE = ED2.GENOTYPE
ORDER BY ED1.ID ASC
SELECT ED2.ID, ED2.GENOTYPE, ED1.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA AS ED1
INNER JOIN ECOLI_DATA AS ED2
ON ED1.ID = ED2.PARENT_ID
WHERE ( ED1.GENOTYPE & ED2.GENOTYPE = ED1.GENOTYPE )
ORDER BY ED2.ID ASC

INNER JOIN을 활용한 쿼리입니다. ALIAS 를 CHILD와 PARENT로 하여 더 직관적입니다.

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;

 

 

SUBQUERY를 사용하여 불필요한 연산이 발생하는 쿼리입니다.

SELECT문에도 QUERY가 들어간 스칼라 서브쿼리

WHERE절에도 QUERY가 들어간 .NESTED SUBQUERY 가 합쳐진 형태를 사용해야 합니다.

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;

 

+ Recent posts