2011-02-04 15 views
6

XMLから親値と子値を一緒に取得しようとすると問題が発生します。コードは以下のように見えますが、親あたり1人の子供しか検索できません。親と一緒にすべての子供を選択するにはどうすればいいですか?XMLの親値と子値を一緒に選択する


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); 

私は、次のような結果を得るが、親がすべての子ノードに対して繰り返したいです。


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

問題はChild [1]ですが、回避方法はわかりません。私はSQLの変数を試みたが、どちらも動作するcouldnt。理想的には、私は以下を見たいと思っています:


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

何か助けていただければ幸いです。ありがとう。

答えて

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

次のコードを試してみてください。

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) 
関連する問題