안녕하세요?
홈페이지를 보고 메일을 보냅니다. 오라클이나 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가 많으면 속도에 문제가 있을듯도 합니다.
홈페이지를 보고 메일을 보냅니다. 오라클이나 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가 많으면 속도에 문제가 있을듯도 합니다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
26 | DYNAMIC SQL 이란? (퍼온글 : 출처모름) | 운영자 | 2002.09.17 | 3291 |
25 | PL/SQL에서 ARRAY사용 예제 | 운영자 | 2002.09.17 | 3254 |
24 | 년중 몇번째 주간인지 알아내기(FUNCTION) - ORACLE이 제공하는 것과 다름 | 운영자 | 2002.09.17 | 3733 |
» | SORT후 번호부여 | 운영자 | 2002.09.17 | 2774 |
22 | JOIN 과 UNION 의 선후관계 | 운영자 | 2002.09.17 | 4634 |
21 | 중복 DATA CHECK | 운영자 | 2002.09.17 | 2790 |
20 | crontab 에 오라클 환경변수를 인식시킬때 [1] | 원우석 | 2004.12.06 | 5024 |
19 | oracle proc 에서 stdarg.h파일사용하기위한 환경설정 | 원우석 | 2004.12.06 | 12829 |
18 | 시스템카탈로그에서 프로시져 정보확인 쿼리 | 원우석 | 2004.07.31 | 2976 |
17 | 프로시져생성 문을 실행하는 방법 | 원우석 | 2004.07.31 | 2721 |
16 | 시스템카탈로그에서 테이블 정보확인 쿼리 | 원우석 | 2004.07.31 | 4559 |
15 | DB2 에러 메시지 확인 | 원우석 | 2004.07.31 | 3044 |
14 | 필드 타입케스팅 | 원우석 | 2004.07.31 | 2973 |
13 | 암호화(이름과,암호를 암호화할때) | 원우석 | 2004.07.31 | 2758 |
12 | 결과를 n개 행만을 취할때 | 원우석 | 2004.07.31 | 2561 |
11 | pre컴파일 및 실행계획로그만들기 | 원우석 | 2004.07.31 | 2752 |
10 | CLP 명령모음집 | 원우석 | 2004.07.31 | 2876 |
9 | sql 문 실행명령 | 원우석 | 2004.07.31 | 3567 |
8 | DB2 종료후 다시 시작 | 원우석 | 2004.07.31 | 2936 |
7 | lock 상태 확인 | 원우석 | 2004.07.31 | 4909 |