2009/02/03 19:04 :: IT 이야기/MS-SQL
가끔 주위에서 문의가 들어와서 만들었던 쿼리인데 생각보다 많이 쓰여 한 번 포스팅 해봅니다.
다음과 같은 두개의 테이블이 있습니다.
create table #t1 (bs_iid int)
create table #t2 (iid int, bs_iid int)
이 때 두개의 테이블을 조인하는데 다음과 같이 결과가 나오게 하는 것입니다.
1 1,2,3
2 3,4,5
만약 다음과 같이 row가 1개라면 colease를 이용하면 됩니다.
1 1,2,3
declare @str varchar(1000)
select @str = coalesce(@str + ',' + cast(t2.iid as varchar(10)), cast(t2.iid as varchar(10)))
from #t1 t1 inner join #t2 t2 on t1.bs_iid = t2.bs_iid
where t1.bs_iid = 1
from #t1 t1 inner join #t2 t2 on t1.bs_iid = t2.bs_iid
where t1.bs_iid = 1
select @str
그러나 다수의 로우가 나와야 된다면..???
예 맞습니다.
위의 쿼리에 대한 부분을 함수로 만들고 상황에 따라 함수를 호출하거나 cross apply를 쓰면 됩니다.
그러나 함수로 만들어 쓰게 되면 비용적인 면에서 손해가 됩니다.
1 row 마다 테이블을 select 할테니까요..
이럴때는 다음과 같은 방식을 스면 됩니다.
select
bs_iid,
stuff(
(
select ',' + cast(t2.iid as varchar)
from #t1 t1 inner join #t2 t2 on t1.bs_iid = t2.bs_iid
where t1.bs_iid = t3.bs_iid
group by t2.iid, t2.bs_iid
order by t2.iid
for xml path('') )
,1,1,'') as iid
from #t1 t3
where t3.bs_iid in (1, 2)
group by bs_iid
다음은 쿼리 전체 입니다. 한 번 테스트 해보세요. 생각보다 많이 쓰입니다. ^ ^
create table #t1 (bs_iid int)
create table #t2 (iid int, bs_iid int)
create table #t2 (iid int, bs_iid int)
insert into #t1 values(1)
insert into #t1 values(2)
insert into #t2 values(1, 1)
insert into #t2 values(2, 1)
insert into #t2 values(3, 1)
insert into #t2 values(2, 1)
insert into #t2 values(3, 1)
insert into #t2 values(4, 2)
insert into #t2 values(5, 2)
insert into #t2 values(6, 2)
insert into #t2 values(5, 2)
insert into #t2 values(6, 2)
select * from #t1
select * from #t2
select * from #t2
select
bs_iid,
stuff(
(
select ',' + cast(t2.iid as varchar)
from #t1 t1 inner join #t2 t2 on t1.bs_iid = t2.bs_iid
where t1.bs_iid = t3.bs_iid
group by t2.iid, t2.bs_iid
order by t2.iid
for xml path('') )
,1,1,'') as iid
from #t1 t3
where t3.bs_iid in (1, 2)
group by bs_iid
bs_iid,
stuff(
(
select ',' + cast(t2.iid as varchar)
from #t1 t1 inner join #t2 t2 on t1.bs_iid = t2.bs_iid
where t1.bs_iid = t3.bs_iid
group by t2.iid, t2.bs_iid
order by t2.iid
for xml path('') )
,1,1,'') as iid
from #t1 t3
where t3.bs_iid in (1, 2)
group by bs_iid
| 태그 : | sql |
