2011-02-04 11 views
6

Problem z próbą odzyskania wartości nadrzędnych i podrzędnych razem z pliku XML. Kod wygląda jak poniżej, ale jest w stanie odzyskać tylko jedno dziecko na rodzica. Jak wybrać wszystkie dzieci z rodzicem?Wybieranie wartości nadrzędnych i podrzędnych XML razem


declare @x xml; 

set @x = ' 
    <Parent ParentID="1" ParentName="Mary"> 
     <Child ChildID="2" ChildName="Paul" /> 
     <Child ChildID="3" ChildName="Alan" /> 
     <Child ChildID="4" ChildName="David" /> 
    </Parent> 
    <Parent ParentID="5" ParentName="James"> 
     <Child ChildID="6" ChildName="Amy" /> 
     <Child ChildID="7" ChildName="Julie" /> 
    </Parent> 
'; 

select 
tbl.col.value('@ParentID', 'int') AS ParentID, 
tbl.col.value('@ParentName', 'varchar(50)') AS ParentName, 
tbl.col.value('Child[1]/@ChildID[1]', 'int') AS ChildID, 
tbl.col.value('Child[1]/@ChildName[1]', 'varchar(50)') AS ChildName 
from @x.nodes('/Parent') as tbl(col); 

Otrzymuję następujące wyniki, ale chcę, aby rodzic powtórzył dla każdego węzła podrzędnego.


ParentID ParentName ChildID ChildName 
1   Mary   2  Paul 
5   James  6  Amy 

Problem to Dziecko [1], ale nie wiem, jak go obejść. Wypróbowałem zmienną sql, ale nie mogłem jej również użyć. Idealnie chciałbym zobaczyć:


ParentID ParentName ChildID ChildName 
1   Mary   2  Paul 
1   Mary   3  Alan 
1   Mary   4  David 
5   James  6  Amy 
5   James  7  Julie 

Każda pomoc byłaby mile widziana. Dzięki.

Odpowiedz

5
select 
tbl.col.value('parent::*/@ParentID', 'int') AS ParentID, 
tbl.col.value('parent::*/@ParentName', 'varchar(50)') AS ParentName, 
tbl.col.value('@ChildID', 'int') AS ChildID, 
tbl.col.value('@ChildName', 'varchar(50)') AS ChildName 
from @x.nodes('/Parent/Child') as tbl(col); 
0

Spróbuj następującego kodu:

select 
    tbl.col.value('@ParentID', 'int') AS ParentID, 
    tbl.col.value('@ParentName', 'varchar(50)') AS ParentName, 
    p.j.value('@ChildID[1]', 'int') AS ChildID, 
    p.j.value('@ChildName[1]', 'varchar(50)') AS ChildName 
    from @x.nodes('/Parent') as tbl(col) 
    cross apply tbl.col.nodes('Child') as p(j) 
Powiązane problemy