지피티가 정리해준 또 다른 sql 코딩 난제. 관련 til
📚 TIL - 프로그래머스 SQL 문제 (물고기 종류별 가장 큰 물고기 찾기)
> 문제링크
❓ 처음 시도한 쿼리
SELECT a.ID, b.fish_name, a.length
FROM fish_info a LEFT JOIN fish_name_info b ON a.fish_type = b.fish_type
WHERE a.length IN (
SELECT l.fish_type, MAX(l.length), n.fish_name
FROM fish_info l LEFT JOIN fish_name_info n ON l.fish_type = n.fish_type
GROUP BY l.fish_type, n.fish_name )
실행 결과 ❌ 오류 발생
이유는 정확히 몰랐지만 WHERE IN에서 뭔가 잘못된 느낌은 들었음.
🧠 문제 원인 분석
- a.length IN (...)는 단일 컬럼과 비교하는 구문인데
- 서브쿼리에서 SELECT l.fish_type, MAX(l.length), n.fish_name → 3개의 컬럼을 반환함
- → IN 비교 대상의 개수와 형태가 안 맞음
→ SQL에서는 IN 앞뒤의 컬럼 수와 순서가 같아야 함!
✅ 해결 방법
🔸 방식 1: JOIN 사용 (가장 안전하고 직관적)
SELECT a.id, b.fish_name, a.length
FROM fish_info a
JOIN fish_name_info b ON a.fish_type = b.fish_type
JOIN (
SELECT fish_type, MAX(length) AS max_length
FROM fish_info GROUP BY fish_type ) m
ON a.fish_type = m.fish_type AND a.length = m.max_length
🔸 방식 2: 튜플 (2개 컬럼) 비교 방식
처음에 접근했던 where in 구문으로 접근하는 방식
SELECT a.id, b.fish_name, a.length
FROM fish_info a JOIN fish_name_info b ON a.fish_type = b.fish_type
WHERE (a.fish_type, a.length) IN (
SELECT fish_type, MAX(length)
FROM fish_info
GROUP BY fish_type )
😵 어려웠던 점 & 🔍 깨달은 점
- 삼중 쿼리(JOIN 안에 서브쿼리 JOIN)는 이번에 처음 접해봄
- WHERE IN절을 쓸 때는 IN 앞의 컬럼 수/종류와
IN 뒤에 오는 서브쿼리의 결과 컬럼 수/종류가 반드시 같아야 한다는 걸 새로 배움 - GROUP BY로 집계한 값만으로는 원래의 전체 행을 복원할 수 없기 때문에
꼭 JOIN 또는 (컬럼1, 컬럼2) IN (...) 패턴을 함께 써야 원하는 결과를 얻을 수 있음
✅ 오늘의 핵심 정리
내용요약
IN 절 조건 | 좌우 컬럼 수, 타입, 순서가 동일해야 함 |
가장 큰 값을 가진 행 전체 가져오기 | JOIN 또는 (컬럼1, 컬럼2) IN (...) 사용 |
삼중 쿼리 | SELECT ... FROM A JOIN (SELECT ... JOIN ...) 형식, 실무에서도 많이 쓰임 |
'SQL 코딩연습' 카테고리의 다른 글
DISTINCT와 한 ID가 여러 정보를 갖고 있을 때 주의할 점 (1) | 2025.04.04 |
---|---|
SQL 코딩 연습 (0) | 2025.04.03 |