큰도움은 못 되겠지만..^ㅡ^; 0 0 4,252

by 호야 RANK 서브쿼리 인라인뷰 [2008.09.19 13:50:39]


서브쿼리 : 쿼리안에 또 다른 쿼리를 말 합니다.
스칼라서브쿼리 ; SELECT 절에 오는 서브쿼리를 말합니다.
인라인 뷰 : 토탈적으로 서브쿼리라고 불리지만 From 절 뒤에 오는 쿼리를
인라인 뷰라고 말 합니다. 즉 가상의 테이블을 만드는 쿼리라고 보심됩니다.
서브쿼리 : WHERE 절 뒤에 오는 쿼리를 말합니다.

관계형 모델은 서로 서로 관계(JOIN)가 이루어 져서 만들어야 합니다.
3개의 테이블을 한테이블로 만들어야 겠죠?
FROM절에 3개를 나열하고 3개의 테이블을 PK(기본키)로 조건을 걸어주어
중복의 데이터가 나오지 않게 만듭니다.
기본적으로 A테이블 * B테이블 * C 테이블 = 새로운 테이블
만들어 지며, 그 로우의 수는 엄청나게 많아 집니다.
그래서 WHERE 절에 A와 B가 같은 것, B와 C가 같은 것들을 간추려
냅니다.. 그걸 하는 것이 WHERE 절입니다.
마지막으로 이렇게 만들어진 테이블에서 무엇을 조회 할것인가에 대해
SELECT 를 실행하여야 합니다.
하지만 한번의 쿼리로 뽑을려면 사원이름을 뽑는것이 힘들어 집니다.

=========사원 이름 없이 뽑는 쿼리 =================


SELECT MAX(A.부서명) AS 부서이름,B.부서코드,MAX(C.월급) AS 최대임금
FROM JOB_EMP A, JOB_MEMBER B, JOB_SAL C
WHERE A.부서코드=B.부서코드 AND B.직급코드=C.직급코드
GROUP BY B.부서코드

자자.. 그럼 인라인 뷰를 이용하여 사원 이름 까지 뽑는걸 해 보겠습니다.

==========인라인뷰와 RANK()을 이용한 쿼리 ===========

SELECT INV.부서이름,INV.부서코드,INV.사원이름,INV.최대임금
FROM (SELECT A.부서명 AS 부서이름,B.부서코드,B.사원이름,C.월급 AS 최대임금
                            ,RANK()  OVER(PARTITION BY 부서코드 ORDER BY 월급 DESC) AS 월급순위
             FROM JOB_EMP A,JOB_MEMBER B,JOB_SAL C
             WHERE A.부서코드=B.부서코드 AND B.직급코드=C.직급코드
             ORDER BY B.부서코드
             ) INV
WHERE INV.월급순위=1

RANK() 함수에 관한 건 강좌 자료나 RANK 를 치면 많은 자료가 나옵니다.
일딴은 서브쿼리에 대한 공부를 하세요..^^: 김정식님이 강좌는 잘해 놔서.. 쉬울 겁니다.

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