서브쿼리 질문 0 3 924

by 가영 [Oracle 기초] [2017.07.19 20:07:50]


연관 서브쿼리(Correlated Subquery)는 서브쿼리 내에 메인쿼리 칼럼이 사용된 서브쿼리이다. 선수 자신이 속한 팀의 평균 키보다 작은 선수들의 정보를 출력하는 SQL문을 연관 서브쿼리를 이용해서 작성해 보면 다음과 같다.

 

SELECT T.TEAM_NAME 팀명, M.PLAYER_NAME 선수명, M.POSITION 포지션, M.BACK_NO 백넘버, M.HEIGHT 키

FROM PLAYER M, TEAM T

WHERE M.TEAM_ID = T.TEAM_ID AND M.HEIGHT < ( SELECT AVG(S.HEIGHT) FROM PLAYER S

WHERE S.TEAM_ID = M.TEAM_ID AND S.HEIGHT IS NOT NULL GROUP BY S.TEAM_ID )

ORDER BY 선수명;

 

여기서 서브쿼리를 돌리면 행이 여러개 나오는 다중행 서브쿼리잖아요

근데 <, =, >=와 같은 비교연산자는 단일행 서브쿼리에서만 사용할 수 있다고 알고있는데

<이 연산자를 써도되는건가요??

oracle초보라 궁금한게 많네요 ㅠㅠ

by jkson [2017.07.19 20:49:25]

서브쿼리에서 TEAM_ID를 받아서 TEAM_ID 로 GROUP BY 하였고 최종적으로 집계함수 AVG를 사용하였기 때문에 서브쿼리의 결과는 단일행이 나오겠죠.

단일행이기 때문에 비교연산 가능합니다.


by 마농 [2017.07.20 08:21:58]

메인 쿼리 결과 각행마다 m.team_id 조건으로 서브쿼리가 수행됩니다.
즉 하나의 team_id 에 대해 서브쿼리가 수행되고 집계함수를 사용하므로 결과는 1건입니다.
집계함수 AVG 는 어차피 Null 을 제외하고 집계되므로 (s.height IS NOT NULL) 조건은 없어도 됩니다.
하나의 team_id 에 대해 서브쿼리가 수행되므로 (GROUP BY s.team_id) 구문도 필요 없습니다.


by 후니후니 [2021.07.21 12:22:46]

WHERE 절에  S.TEAM_ID = M.TEAM_ID 조건을 넣어주셨기 때문에 AVG(S.HEIGHT)는 서브쿼리가 실행될 때 1건의 결과만 나오게 됩니다.

서브쿼리에 관련된 다른 예제 링크로 걸었으니 참고해보시면 좋을것같습니다


댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입