데이터베이스 개발자 질문과 답변 게시판
데이터베이스 개발/운영 관련 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
사용자그룹에 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 |
샘플로 만들어 보았습니다.
CREATE TABLE t1
(
A1 INT
, A2 VARCHAR(100)
, A3 VARCHAR(100)
)
GO
CREATE TABLE u1
(
A1 VARCHAR(100)
, A2 VARCHAR(100)
)
GO
INSERT INTO t1 VALUES(1,NULL, '0001')
INSERT INTO t1 VALUES(12,NULL, '0001')
INSERT INTO t1 VALUES(3,NULL, '0001')
INSERT INTO t1 VALUES(4,NULL, '0001')
INSERT INTO t1 VALUES(5,NULL, '0001')
INSERT INTO t1 VALUES(6,NULL, '0001')
INSERT INTO t1 VALUES(17,NULL, '0001')
INSERT INTO t1 VALUES(9,NULL, '0001')
INSERT INTO t1 VALUES(10,NULL, '0001')
INSERT INTO t1 VALUES(11,NULL, '0001')
INSERT INTO t1 VALUES(120,NULL, '0002')
INSERT INTO t1 VALUES(13,NULL, '0001')
INSERT INTO t1 VALUES(14,NULL, '0001')
INSERT INTO t1 VALUES(115,NULL, '0001')
INSERT INTO t1 VALUES(16,NULL, '0001')
INSERT INTO t1 VALUES(17,NULL, '0001')
INSERT INTO t1 VALUES(130,NULL, '0002')
GO
INSERT INTO u1 values('0001', 'A')
INSERT INTO u1 values('0001', 'B')
INSERT INTO u1 values('0001', 'C')
INSERT INTO u1 values('0002', 'Z')
GO
UPDATE t1
SET A2 = u.A2
FROM t1 t
INNER JOIN
(
SELECT t.A1, u.A2, t.A3
FROM (
SELECT ROW_NUMBER() OVER(PARTITION BY A3 ORDER BY A1 ASC) - 1 AS Row
, A1, A2, A3
FROM t1
) t
INNER JOIN
(
SELECT ROW_NUMBER() OVER(PARTITION BY A1 ORDER BY A1 ASC) AS Row
, count(*) OVER (PARTITION BY A1) as cnt
, A1, A2
FROM u1
) u
ON t.A3 = u.A1
AND (t.row % u.cnt) + 1 = u.Row
) u
ON t.A1 = u.A1
-- catchv