문제 : https://programmers.co.kr/learn/courses/30/lessons/59042
ANIMAL_OUTS 테이블 에는 존재하지만, ANIMAL_INS 테이블에는 존재하지 않는 동물의 ID, NAME을 SELECT 하는 문제이다. ID로 오름차순 정렬하여 출력해야한다.
첫번째 방법 - 서브쿼리 사용하기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_INS)
ORDER BY ANIMAL_ID;
제일 처음 떠올렸던 방법이다.
ANIMAL_OUTS 테이블의 ANIMAL_ID 중에 ANIMAL_INS 테이블에는 없는 ID를 조회한다
두번째 방법 - LEFT JOIN 사용하기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS A
LEFT JOIN ANIMAL_INS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.ANIMAL_ID;
ANIMAL_OUTS 테이블의 alias 를 A로, ANIMAL_INS 테이블의 alias를 B로 설정했다.
ANIMAL_OUTS 를 기준으로 LEFT JOIN 해야한다. 만약 ANIMAL_INS를 기준으로 LEFT JOIN 하면 ANIMAL_INS에 존재하는 ANIMAL_ID만 나오기 때문에 둘의 차이를 알 수 없다.
JOIN은 각 테이블의 ANIMAL_ID를 기준으로 했다 (ON 부분)
LEFT JOIN을 하게 되면, A에는 있는 ID가 B에는 없으므로 B.ANIMAL_ID 가 NULL 인 tuple이 존재한다. 따라서 이 null 인 tuple에서 ANIMAL_ID를 가져오면 된다.
SELECT *
FROM ANIMAL_OUTS A
LEFT JOIN ANIMAL_INS B
ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY A.ANIMAL_ID;
이렇게 LEFT JOIN 한 것만 실행시켜보면
이런식으로 결과가 출력이 되는데, 이때 상위 3개의 튜플과 같이 A의 ANIMAL_ID는 존재하지만, B의 ANIMAL_ID는 NULL 인 튜플이 정답인것이다!
'개발 > database' 카테고리의 다른 글
[Oracle] programmers - 보호소에서 중성화한 동물 (0) | 2021.08.05 |
---|---|
[Oracle] programmers - 오랜 기간 보호한 동물(1) (0) | 2021.08.05 |
[programmers]sql-입양 시각 구하기(1) (0) | 2021.02.26 |
[programmers]sql-Null 처리하기 (0) | 2021.02.26 |
ubuntu mysql 비밀번호 설정하기 (0) | 2021.01.24 |