각 레코드 하나에 대해 자기보다 작은 값을 가지는 RECORD 수 만큼 조인이 걸린다.

조인에 의해 생성된 집합의 각 레코드가 어떤 그룹핑단위를 가질것인지를 결정해준다.

결정된 그룹핑 단위로 그룹을 지으면 원래 테이블에 있는 각 레코드가 그룹핑 단위가 되어 누계가 나오게되고

, 그것을 원래 값과 조인시켜주면 원하는 값이나온다.

 

 

 

1
2
3
4
SELECT ROWNUM RCNT, B
 
   FROM TEST01
  WHERE A <= '00010';
cs

 

 

 

위와 같은 쿼리를 만들어서 IN-LINE VIEW를 사용하고 GR_1이라 하자.

 

1
2
3
SELECT ROWNUM JCNT
  FROM TEST01
 WHERE A <= '00010';
cs

 

 

위와 같은 쿼리를 만들어서 IN-LINE VIEW를 사용하고 GR_2이라 하자.

 

두개의 테이블을 조인하면 RECORD수가 그 제곱만큼 늘어나는 데이터가 생김 (CARTESIAN PRODUCT) 이생긴다.

JCNT  1을 기본 레코드로, 2는 참조하고자 하는 전값, 3은 전 전값,  4는 그 전값 식으로 순위를 가지게된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT DECODE(JCNT, 1, RCNT , RCNT -1 + JCNT ) R_CNT , B , JCNT
  
  
  FROM ( 
         SELECT ROWNUM RCNT ,
                A,
                B
           FROM TEST01
          WHERE A<= '00010'
        ) GR_1, 
        (
          SELECT ROWNUM JCNT
            FROM TEST01
           WHERE A<= '00010'
        ) GR_2 ;
cs

 

 

 

 

카티젼프로덕트이므로 10*10 = 100레코드형태로 표출되며, RCNT에 대하여 JCNT를 첨자로 하는 2차월 배열형태로 생긴다.

JCNT가 1이면 RCNT 값을 , 그보다 크면 RCNT -1 + JCNT 값을 SUM을 위한 그룹핑 단위로 가지면된다.

 

 

추출된 모든 RECORD는 RCNT와 JCNT를 갖는다.

JCNT를 기준으로 하든 RCNT를 기준으로 하든 똑같은 결과가 나온다.

JCNT를 기준으로 생각해보는 경우 JCNT가 1이면, RCNT 자신의 값이 GROUP 단위가 되고, JCNT가 2이면 RCNT-1,

3이면 RCNT-2, 4이면 RCNT-3이 동일 그룹단위가 된다.

 

 

 

출처 : 이채남의 오라클 실습

 

'DataBase' 카테고리의 다른 글

소계와 합계 구하는 방법 (1)  (0) 2015.12.17
프로시져란 (PROCEDURE) ?  (0) 2015.12.16
COPY_T 테이블이란?  (0) 2015.12.16
누계를 구하는 방법에 대하여 (1)  (0) 2015.12.10
SUBSTR 함수  (0) 2015.12.09
블로그 이미지

클라인STR

,