쿼리질문이요(일련번호별로 그룹에 해당하는 사용자ID를 자동할당) 0 2 1,505

by 무뚝이 [SQL Query] [2013.03.16 10:55:50]



사용자그룹에 3개 아이디(A,B,C)와

일련번호테이블이 있다고 할때

그룹코드가 0001일경우 0001그룹에 해당하는 아이디 A,B,C를

무조건 순차적으로 일련번호테이블의 사용자ID를 채워주는것입니다.

while문을 적용해서 처리하긴 했지만

실시간으로 넘어오는 일련번호 테이블을 5분마다 배치처리되야하므로

튜닝을 해야하는데..

쿼리를 어떻게 짜야될지 감이 잘안오네요

경험많은분들의 조언 부탁드립니다.


일련번호테이블 사용자그룹테이블
일련번호 사용자ID 그룹코드 그룹코드 사용자ID
5 NULL 0001 0001 A
8 NULL 0001 0001 B
11 NULL 0001 0001 C
14 NULL 0001
17 NULL 0001
19 NULL 0001
20 NULL 0001
21 NULL 0001
23 NULL 0001
24 NULL 0001
반영된 결과테이블
일련번호 사용자ID 그룹코드
5 A 0001
8 B 0001
11 C 0001
14 A 0001
17 B 0001
19 C 0001
20 A 0001
21 B 0001
23 C 0001
24 A 0001
by 아린 [2013.03.16 13:15:01]
WITH 일련번호테이블(일련번호, 사용자ID, 그룹코드) AS(   
SELECT  5, NULL, '0001' FROM dual UNION ALL        
SELECT  8, NULL, '0001' FROM dual UNION ALL
SELECT 11, NULL, '0001' FROM dual UNION ALL
SELECT 14, NULL, '0001' FROM dual UNION ALL
SELECT 17, NULL, '0001' FROM dual UNION ALL
SELECT 19, NULL, '0001' FROM dual UNION ALL
SELECT 20, NULL, '0001' FROM dual UNION ALL
SELECT 21, NULL, '0001' FROM dual UNION ALL
SELECT 23, NULL, '0001' FROM dual UNION ALL
SELECT 24, NULL, '0001' FROM dual
), 사용자그룹테이블(그룹코드, 사용자ID) AS(
SELECT '0001', 'A' FROM dual UNION ALL
SELECT '0001', 'B' FROM dual UNION ALL
SELECT '0001', 'C' FROM dual
)
SELECT a.일련번호, a.그룹코드 
     , REGEXP_SUBSTR(b.사용자id, '[^,]+', 1
                   , DECODE(MOD(rn, usr_cnt)
                   , 0, usr_cnt
                   , MOD(rn, usr_cnt)) ) usrid
  FROM (SELECT 일련번호, 사용자ID, 그룹코드
             , ROW_NUMBER() OVER(ORDER BY 일련번호) rn
          FROM 일련번호테이블
         WHERE 그룹코드 = '0001' 
        ) a 
     , (SELECT LISTAGG(사용자ID, ',') WITHIN GROUP(ORDER BY 사용자id) 사용자id
             , COUNT(*) usr_cnt
          FROM 사용자그룹테이블
         WHERE 그룹코드 = '0001'
        ) b   
;

SELECT 문장을 UPDATE 나 MERGE 로 수정해서 사용하시면 되겠는데, 
다음 배치처리가 자동으로 "B" 부터 하지는 않고
처음 "A" 부터 시작합니다. 




by 무뚝이 [2013.03.17 02:20:29]

감사합니다.
참고하겠습니다.^^

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