2011-07-27 2 views
1

테이블 table1에 xml 열 geographyIdXml이 있습니다.table1에 xml을 사용하여 table2를 조인하고 결합 된 문자열로 table2의 모든 항목을 반환합니다.

그 열에있는 XML은 다음과 같다 :

<args> 
    <arg val="1" /> 
    <arg val="2" /> 
    miss a few.. 
    <arg val="99" /> 
    <arg val="100" /> 
</args> 

<arg/> 각 태그 내의 속성이 valgeographies 테이블의 행 ID 항목을 말한다.

table1에서 몇 개의 열과 geographyIdXml 필드와 관련된 지리 이름을 단일 행 및 단일 열로 반환하고자합니다. 이러한 경우

예를 들어, 열이 반환

1, 'My spectacular campaign', 'New York, Paris, Peckham' 

나는이 작업을 얻기 위해 오후 내내 시도했다 :

id, name, geographies 

데이터가 같이 표시됩니다.

cross apply geographyIdXml.nodes('args/arg') as ids(id) 
inner join core..tbl_geography g on g.id = ids.id.value('@val','int') 

을 시도하지만 그건 단지 XML 위 및 병합 시도

에 항목 당 하나 개의 행을 반환하지만 나는 그것이 작동시킬 수 없습니다.

누구나 아이디어가 있다면, 나는 모두 귀입니다. 감사.

------ UPDATE - SQL 예 ---------

select r.*, coalesce(g.name + ', ','') as name 
from campaignRun r 
cross apply geographyIdXml.nodes('args/arg') as ids(id) 
inner join geographies g on g.id = ids.id.value('@val','int') 
where r.id = 1 

내가 할 열 행을 반환 - 하나를 geographyIdXml 필드의 각 노드에 대해 - 잘못된 것입니다.

내가 원하는 것은 모든 지형의 결합 된 필드가있는 하나의 행이지만 어쨌든 geographies 테이블을 geographyIdXml 필드의 xml을 사용하여 내 campaignRun 테이블에 결합해야합니다. 당신이

답변

1

은 실제 SQL을 수행하는 다른 답변을 시작했다.

다음 설치 재료를 사용 :

create table campaignrun (ID int, name varchar(50), geographyIDXml xml) 

insert campaignrun 
select 1, 'My Spectacular Campaign', '<args> 
    <arg val="1" /> 
    <arg val="2" /> 
    <arg val="3" /> 
    </args> 
' 

create table geographies (ID int, name varchar(50)) 

insert geographies 
select 1, 'New York' 
union select 2, 'Paris' 
union select 3, 'Peckham' 

이 스크립트 :

select 
    r.ID, 
    r.Name, 
    Geographies = STUFF(
     (SELECT ', ' + name 
     FROM 
      geographyIdXml.nodes('args/arg') as ids(id) 
      join geographies g on g.id = ids.id.value('@val','int') 
     FOR XML PATH ('')) 
     ,1,2,'') 
from campaignRun r 

where r.id = 1 

결과 :

ID Name      Geographies 
1  My Spectacular Campaign  New York, Paris, Peckham 

FOR XML 비트가 함께 문자열을 연결하는 속임수의 방법입니다.STUFF은 문자열의 처음부터 처음 두 문자 (예 : ",")를 쉽게 제거 할 수 있습니다.

+0

당신은 선생님, 천재 천재입니다 - 정말 고마워요! – adrianos

+0

걱정할 필요가없는 서비스 (guvnor)가있어서 기쁩니다 - 질문에서 "유일한 바보"참조를 좋아합니다. –

1

을 제공 할 수있는 모든 도움을

덕분에 그래서 당신이하려는 것은 하나의 이름으로 모든 지리 이름을 (그들을 함께 연결하여)에 가입합니다. 그래서이 최근 SO 질문은 몇 가지 아이디어를 제공해야하는 경우 :

Concatenate many rows into a single text string?

+0

링크 고마워요.하지만 xml 열을 사용하는 테이블 조인과 함께 작동하려면 병합이 필요합니다. – adrianos

+0

별도의 행을 생성하는 전체 SQL을 게시 한 다음 업데이트 할 수 있습니까? . –

+0

내일 일할 때 게시 해 드리겠습니다. 고마워. – adrianos

관련 문제