강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của xogh45675010
xogh45675010

câu hỏi đã được viết

Bài tập SQL cho phân tích dữ liệu (Advent of SQL 2024)

Ngày 5. Tìm dữ liệu không chứa dấu gạch dưới (_) (Lớp nhập môn Tuần 1)

게임을 10개 이상 발매한 게임 배급사 찾기

Đã giải quyết

Viết

·

53

0

WITH STAT AS(
  SELECT publisher_id, name
  FROM games
  GROUP BY publisher_id, name
  HAVING COUNT(*) >=10
)

SELECT A.name
FROM STAT AS A
JOIN companies AS B
ON A.publisher_id = B.company_id

mysql로 이렇게 작성하니까 답이 하나만 나오는데, 강사님이 작성한 코드

SELECT name
FROM(
  SELECT publisher_id, COUNT(*) AS CNT
  FROM games
  GROUP BY publisher_id
  HAVING CNT>= 10
) AS A
JOIN companies AS B
ON A.publisher_id = B.company_id

이것과 차이가 뭔지 궁금합니다

sqlmysqlpostgresqlsqlite

Câu trả lời 2

1

안녕하세요, 인프런 AI 인턴입니다.

태호님이 작성하신 SQL 쿼리와 강사님이 작성한 쿼리의 차이에 대해 설명드리겠습니다.

태호님의 쿼리에서는 games 테이블에서 publisher_idname을 선택하고, COUNT(*) >= 10 조건으로 그룹화한 후, 결과를 STAT이라는 CTE에 저장하고 있습니다. 여기서 문제는 name을 그룹화 기준으로 포함했다는 점입니다. 게임마다 name(게임 이름)이 다를 경우, 적절한 그룹화가 이루어지지 않아 예상과 다른 결과가 나타날 수 있습니다.

강사님이 작성한 쿼리에서는 publisher_id와 그에 따른 게임 개수만을 기준으로 그룹화하였습니다. 그런 다음 결과를 사용하는 서브쿼리 내에서 COUNT(*)(별칭 CNT)를 체크하고, 조건에 맞는 publisher_idcompanies 테이블과 조인하여 적절한 결과를 내고 있습니다.

결론적으로, 두 쿼리의 차이는 태호님 쿼리에 추가된 name 필드로 인해 그룹의 기준이 달라져 있던 것입니다. 강사님의 방식대로 publisher_id 만을 기준으로 그룹화하게 되면 필요한 것을 정확하게 추출할 수 있습니다.

강사님의 쿼리가 다음과 같은 이유로 올바르게 동작합니다:
https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#query-by-example.introduction

더 도움이 필요하신 경우, 언제든지 질문 남겨주세요.

0

jaemin님의 프로필 이미지
jaemin
Người chia sẻ kiến thức

아래 AI 인턴의 답변대로 STAT CTE 안에서 GROUP BY publish_id, name 이렇게 두 컬럼으로 그룹핑을 한 부분이, 정답 쿼리의 GROUP BY publish_id 와 상이합니다.

Hình ảnh hồ sơ của xogh45675010
xogh45675010

câu hỏi đã được viết

Đặt câu hỏi