메뉴 건너뛰기

tnt_db

Oracle SORT후 번호부여

운영자 2002.09.17 20:22 조회 수 : 2660 추천:16

안녕하세요?
홈페이지를 보고 메일을 보냅니다. 오라클이나 SQL server나 표준 SQL은 같으니깐 하나만 여쭤볼께요.
Table에 A, B, C, D 필드가 있다고 가정할 때, B 필드의 값에 따라 order by를
하여 일럴로 sort한 후에 그 순서대로 값을 1부터 매겨 하나씩 증가시켜 A에
Update한다고 할 때.
SQL을 어떻게 써야 할까요? 좋은 아이디어 부탁드립니다.
아시는대로 알려주시면 정말 감사하겠습니다.


SELECT EMPNO,ENAME,JOB,MGR
FROM EMP;
위와같이 읽으면 다음과 같은 DATA가 끌려 옵니다.
--
EMPNO      ENAME      JOB       MGR      
---------- ---------- --------- ----------
      7369 SMITH      CLERK           7902
      7499 ALLEN      SALESMAN        7698
      7521 WARD       SALESMAN        7698
      7566 JONES      MANAGER         7839
      7654 MARTIN     SALESMAN        7698
      7698 BLAKE      MANAGER         7839
      7782 CLARK      MANAGER         7839
      7788 SCOTT      ANALYST         7566
      7839 KING       PRESIDENT          
      7844 TURNER     SALESMAN        7698
      7876 ADAMS      CLERK           7788
      7900 JAMES      CLERK           7698
      7902 FORD       ANALYST         7566
      7934 MILLER     CLERK           7782
14 행이 선택되었습니다

이 DATA를 ENAME으로 SORT 하기 위해
GROUP BY 를 하면 다음과 같습니다.

SELECT ENAME,
       MAX(EMPNO) EMPNO,
       MAX(JOB)   JOB,
       MAX(MGR)   MGR
FROM   EMP
GROUP BY ENAME;

ENAME      EMPNO      JOB       MGR      
---------- ---------- --------- ----------
ADAMS            7876 CLERK           7788
ALLEN            7499 SALESMAN        7698
BLAKE            7698 MANAGER         7839
CLARK            7782 MANAGER         7839
FORD             7902 ANALYST         7566
JAMES            7900 CLERK           7698
JONES            7566 MANAGER         7839
KING             7839 PRESIDENT          
MARTIN           7654 SALESMAN        7698
MILLER           7934 CLERK           7782
SCOTT            7788 ANALYST         7566
SMITH            7369 CLERK           7902
TURNER           7844 SALESMAN        7698
WARD             7521 SALESMAN        7698

여기까지의 결과를 IN-LINE VIEW로 사용하여 다시 번호를 붙여 읽으면

SELECT ROWNUM SEQ,
       ENAME,
       EMPNO,
       JOB,
       MGR
FROM ( SELECT ENAME,
              MAX(EMPNO) EMPNO,
              MAX(JOB)   JOB,
              MAX(MGR)   MGR
       FROM   EMP
       GROUP BY ENAME);

SEQ        ENAME      EMPNO      JOB       MGR      
---------- ---------- ---------- --------- ----------
         1 ADAMS            7876 CLERK           7788
         2 ALLEN            7499 SALESMAN        7698
         3 BLAKE            7698 MANAGER         7839
         4 CLARK            7782 MANAGER         7839
         5 FORD             7902 ANALYST         7566
         6 JAMES            7900 CLERK           7698
         7 JONES            7566 MANAGER         7839
         8 KING             7839 PRESIDENT          
         9 MARTIN           7654 SALESMAN        7698
        10 MILLER           7934 CLERK           7782
        11 SCOTT            7788 ANALYST         7566
        12 SMITH            7369 CLERK           7902
        13 TURNER           7844 SALESMAN        7698
        14 WARD             7521 SALESMAN        7698
14 행이 선택되었습니다

이렇게 됩니다.

이걸 다시  TABLE에 UPDATE 하기위해 사용한다면
어떤컬럼이 KEY 냐에 따라 다르겠지만 이 TABLE은 KEY가 EMPNO 이므로
다음과 같이 됩니다.

UPDATE EMP A
SET    EMPNO = (SELECT SEQ
                FROM  (SELECT ROWNUM SEQ,
                              ENAME,
                              EMPNO,
                              JOB,
                              MGR
                       FROM ( SELECT ENAME,
                                     MAX(EMPNO) EMPNO,
                                     MAX(JOB)   JOB,
                                     MAX(MGR)   MGR
                              FROM   EMP
                              GROUP BY ENAME)
                      ) B
               WHERE  B.EMPNO=A.EMPNO
              )

이렇게 하면 결과가 이렇게 됩니다.

EMPNO      ENAME      JOB       MGR        HIREDATE             SAL        COMM       DEPTNO    
---------- ---------- --------- ---------- -------------------- ---------- ---------- ----------
        12 SMITH      CLERK           7902 80/12/17                    800                    20
         2 ALLEN      SALESMAN        7698 81/02/20                   1600        300         30
        14 WARD       SALESMAN        7698 81/02/22                   1250        500         30
         7 JONES      MANAGER         7839 81/04/02                   2975                    20
         9 MARTIN     SALESMAN        7698 81/09/28                   1250       1400         30
         3 BLAKE      MANAGER         7839 81/05/01                   2850                    30
         4 CLARK      MANAGER         7839 81/06/09                   2450                    10
        11 SCOTT      ANALYST         7566 82/12/09                   3000                    20
         8 KING       PRESIDENT            81/11/17                   5000                    10
        13 TURNER     SALESMAN        7698 81/09/08                   1500          0         30
         1 ADAMS      CLERK           7788 83/01/12                   1100                    20
         6 JAMES      CLERK           7698 81/12/03                    950                    30
         5 FORD       ANALYST         7566 81/12/03                   3000                    20
        10 MILLER     CLERK           7782 82/01/23                   1300                    10

원하시는 답이면 좋겠군요..
UPDATE는 직접하지않고 PROCEDURE를 이용하시는게 좋을듯도 하군요..
DATA가 많으면 속도에 문제가 있을듯도 합니다.
위로