SQL 코딩연습

삼중쿼리와 where ~ in 구문

mtepg924 2025. 4. 3. 19:48

지피티가 정리해준 또 다른 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