사용자테이블에 3개 아이디(A,B,C)와
일련번호테이블이 있다고 할때
사용자ID별 개수만큼 일련번호테이블의 사용자ID를 채워주는것입니다.
이런것도 한방의 쿼리로 가능할까요?
이것도 뺑뺑이 돌려서 처리하긴했지만,, 속도가 넘 느리네요.
일련번호테이블 | 사용자테이블 | |||
일련번호 | 사용자ID | 사용자ID | 개수 | |
5 | NULL | A | 2 | |
8 | NULL | B | 5 | |
11 | NULL | C | 3 | |
14 | NULL | |||
17 | NULL | |||
19 | NULL | |||
20 | NULL | |||
21 | NULL | |||
23 | NULL | |||
24 | NULL | |||
반영된 결과테이블 | ||||
일련번호 | 사용자ID | |||
5 | A | |||
8 | A | |||
11 | B | |||
14 | B | |||
17 | B | |||
19 | B | |||
20 | B | |||
21 | C | |||
23 | C | |||
24 | C |
|
Comment 2
-
건우아빠
2013.03.18 12:05
-
건우아빠
2013.03.18 15:29
-- 1번
;with
data1 as (
select 'A' id , 2 num union all
select 'B' id , 5 num union all
select 'C' id , 3 num ) ,
data2 as (
select 5 no union all
select 8 no union all
select 11 no union all
select 14 no union all
select 17 no union all
select 19 no union all
select 20 no union all
select 21 no union all
select 23 no union all
select 24 no ) ,
result1 as ( -- 사용자테이블을가지고구간을설정
select a.id , a.num , sum(b.num ) - a.num + 1 f_num , sum(b.num ) t_num
from data1 a left join data1 b on a.id >= b.id
group by a.id , a.num ) ,
result2 as ( -- 순서를부여
select row_number() over (order by no ) idx , no
from data2
)
select b.no
, a.id
from result1 a
cross apply
(
select no
from result2
where idx between a.f_num and a.t_num
) b
-- 2번
;with
data1 as (
select 'A' id , 2 num union all
select 'B' id , 5 num union all
select 'C' id , 3 num ) ,
data2 as (
select 5 no union all
select 8 no union all
select 11 no union all
select 14 no union all
select 17 no union all
select 19 no union all
select 20 no union all
select 21 no union all
select 23 no union all
select 24 no ) ,
result1 as (
select a.id , row_number() over ( order by a.id) idx
from data1 a
cross apply
( select number
from master.dbo.spt_values
where type = 'P'
and number < a.num ) b )
select b.no , a.id
from result1 a join ( select ROW_NUMBER() over (order by no ) idx
, no from data2
) as b on a.idx = b.idx
방배정, 분배 , 할당 개념하고 유사하네요... 댓글로 검색하시면 아래 두가지 방법이 있던것 같습니다.
답글을 달아드린 기억이 나네요.
1) 사용자테이블을 이용해서 순서의 구간을 만들고
일련번호테이블은 일련번호별 순서를 부여한다음
cross apply로 구간을 검색하시는 방법을 하시면 될듯 합니다.
2) 다른 방법으로 사용자테이블을 각 사용자별 갯수만큼 동일한 사용자 번호를 만드시고 순서를 부여
일련번호테이블은 일련번호별 순서를 부여한다음 두개순서로 조인하는 방법