2016-07-06 31 views
2

Microsoft SQL Serverを使用しています。複数のサブ要素を含むSQLクエリ階層型XML

私はXMLで有向グラフのような単純な階層構造を持っている:

SOURCE_NODE_ID | DEST_NODE_ID 
1    | 2 
1    | 3 
1    | 4 
2    | 1 
2    | 3 

このようなクエリ:

DECLARE @XML as XML = CAST(
'<ROOT> 
    <NODE NODE_ID="1"> 
     <EDGE>2</EDGE> 
     <EDGE>3</EDGE> 
     <EDGE>4</EDGE> 
    </NODE> 
    <NODE NODE_ID="2"> 
     <EDGE>1</EDGE> 
     <EDGE>3</EDGE> 
    </NODE> 
</ROOT>' AS XML); 

私の所望の出力は、このような表になります

SELECT B.value('data(@NODE_ID)','int') AS SOURCE_NODE_ID, 
     A.B.value('(EDGE/text())[1]', 'int') AS DEST_NODE_ID 
FROM @XML.nodes('/ROOT/NODE') AS A(B); 

返品のみ最初のエッジ:

SOURCE_NODE_ID | DEST_NODE_ID 
1    | 2 
2    | 1 

この1つは少し良くない:

SOURCE_NODE_ID | DEST_NODE_ID 
1    | 234 
2    | 13 

どのように取得することができます。

SELECT B.value('data(@NODE_ID)','int') AS SOURCE_NODE_ID, 
     B.query('EDGE').value('.', 'int') AS DEST_NODE_ID 
FROM @XML.nodes('/ROOT/NODE') AS A(B); 

だけそれが一つのセルにすべてのエッジを連結します私の望む結果?内側のクエリなどと結合する必要がありますか?おそらく私はそれを複雑にしています、確かにこれには簡単な解決策がありますか?

+0

これは良い質問です:Copy'n'pasteableテストコード、自身の努力、予想される出力、明確な説明..すべての質問だけがこのようなものだった場合:-)それを投票しました! – Shnugo

答えて

4

多くNODE要素があるように、この

ようにそれを試してみてください、あなたは彼らのために.nodes()を呼び出す必要があります。 EDGE要素がネストされているので、CROSS APPLY .nodes()を呼び出す必要があります。

残りは簡単です...

DECLARE @XML as XML = CAST(
'<ROOT> 
    <NODE NODE_ID="1"> 
     <EDGE>2</EDGE> 
     <EDGE>3</EDGE> 
     <EDGE>4</EDGE> 
    </NODE> 
    <NODE NODE_ID="2"> 
     <EDGE>1</EDGE> 
     <EDGE>3</EDGE> 
    </NODE> 
</ROOT>' AS XML); 

SELECT Nd.value('@NODE_ID','INT') AS SOURCE_NODE_ID 
     ,Edg.value('.','INT') AS DEST_NODE_ID 
FROM @XML.nodes('/ROOT/NODE') AS A(Nd) 
CROSS APPLY A.Nd.nodes('EDGE') AS B(Edg) 

結果

SOURCE_NODE_ID DEST_NODE_ID 
1    2 
1    3 
1    4 
2    1 
2    3 
+0

ああ、CROSS APPLY、私はそれを前に見ていたが、まだ私の頭を包むことができなかった...あなたの雷の速い応答に感謝! –

+0

@LouisSomers、これを読んでうれしい!あなたはとても近かった!あなたの良い質問にThxあなたのクエリをコピーして、いくつかの文字を入力し、答えを置くことは大したことではなかった...ハッピーコーディング! – Shnugo

関連する問題