2010-03-01 1 views
0

두 개의 SQL 테이블 인 parent (전체 디자인 제어 권한이 있음)와 child (변경할 수 없음)를 조인하려고합니다. 부모 테이블을 변경하여 자식 레코드의 ID에 대한 CSV 목록이 포함 된 varchar 열을 포함하게합니다. 이제 부모 당 하나의 행을 반환하는 셀렉트를 수행하고 일부 카운터는 다시 수행하려고합니다. 아이들 (즉, 얼마나 많은 아이들이 "상태"가 참인지).CSV 값을 사용하는 SQL 조인? 어쩌면 XML 사용?

원래 CSV 목록을 XML 문자열로 변환하고 Xml 형식의 열로 캐스팅하고 XML "노드"를 사용하여 하위 표에 가입시킬 수 있다고 생각했지만 - 구문 오른쪽.

누구에게 제안 할 수 있습니까?

감사합니다, 로스

좀 더 손보는 및 인터넷 검색으로

declare @true bit; set @true = ~0 
declare @false bit; set @false = 0 
declare @parent table (id int, children varchar(max)) 
declare @child table (id int, status bit) 

insert into @parent values (1,'1,2,3') 
insert into @child values (1,@true) 
insert into @child values (2,@false) 
insert into @child values (3,@false) 

;with parent as 
(
select id as 'parentId', cast('<children><child id="' + replace (children,',','"/><child id="') + '"/></children>' as xml) as 'children' from @parent 
) 
select parentId, t2.child.query('.') 
from parent 
--join @child as child on (child.id = ??) 
cross apply children.nodes('/children/child') as t2(child) 
+0

두 테이블을 상호 참조 할 수있는 세 번째 테이블을 만들 수 있다는 것을 알고 있지만 CSV 목록을 사용하여 조인을 수행하는 데 더 많은 기술이 필요했습니다. –

답변

0

(여기에 내가 놀겠다는 거 봤는데 기능), 지금이 있습니다

declare @true bit; set @true = ~0 
declare @false bit; set @false = 0 
declare @parent table (id int, children varchar(max)) 
declare @child table (id int, status bit) 

insert into @parent values (1,'1,2,3') 
insert into @child values (1,@true) 
insert into @child values (2,@false) 
insert into @child values (3,@false) 
insert into @parent values (2,'4,5,6') 
insert into @child values (4,@true) 
insert into @child values (5,@false) 
insert into @child values (6,@false) 

;with parent as 
(
select id as 'id', cast('<children><child id="' + replace(children,',','"/><child id="') + '"/></children>' as xml) as 'children' from @parent 
) 
select parent.id 
    ,count(child.id) as 'children' 
    ,sum(case when child.status = @true then 1 else 0 end) as 'success' 
    ,sum(case when child.status = @false then 1 else 0 end) as 'failed' 
from parent 
cross apply children.nodes('/children/child') as t2(child) 
join @child as child on (child.id = t2.child.value('@id', 'int')) 
group by parent.id 

알맞은가요?

감사합니다.