Blog | Tag | Local | Media | Guest | Login  RSS

가끔 주위에서 문의가 들어와서 만들었던 쿼리인데 생각보다 많이 쓰여 한 번 포스팅 해봅니다.

다음과 같은 두개의 테이블이 있습니다.
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
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)

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(4, 2)
insert into #t2 values(5, 2)
insert into #t2 values(6, 2)
select * from #t1
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

[구글 서비스 활용 팁]

Norton Security Scan -노턴 백신을 무료로 사용 가능 합니다.
Spyware Doctor™ Starter Edition - 스파이웨어를 자동으로 제거해 줍니다.
데스톱 검색도 구글 데스톱 서치 입니다.

블로그나 웹사이트에서 광고 수익을 원하십니까 ?

 태그 : 
이 글의 관련글(Trackback) 주소 :: http://www.sleepyon.com/trackback/209 관련글 쓰기
Name
Password
Homepage
비밀글 (Secret)