2016-03-29 16 views
0

このXMLファイルでは、残りのノードはすべて最初のものに依存しています。私はそれを説明するのに役立つツリー図を作成しました。XMLデータ複数のノード

XML Data Schema

私が午前問題は、各ノードが最初のものに依存しますが、彼らはお互いにリンクするすべての列を持っていないということです。

ここでここで XML Document

へのリンクは、これまでのところ、私のSQLです

SELECT 
     B.RD.query('racedata/todays_cls').value('.','varchar(max)') AS todays_cls, 
     B.RD.query('racedata/horsedata/horse_name').value('.', 'varchar(max)') AS horse_name, 
     B.RD.query('racedata/horsedata/jockey/jock_disp').value('.', 'varchar(max)') AS jockeyname 
     FROM @xmlData.nodes('data') AS B(RD) 

Updated SQL Query

答えて

1

あなたが得るように、最初の1の結果に二CROSS APPLYを実行します。現在の<racedata>に対応する要素は<horsedata>です。以下の作業デモの例を参照してください。

サンプルデータ:

declare @xml XML = ' 
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.trackmaster.com/xmlSchema/ppXMLData.xsd"> 
    <racedata> 
    <race>1</race> 
    <todays_cls>59</todays_cls> 
    <distance>800.0</distance> 
    <country>USA</country> 
    <horsedata> 
     <horse_name>BROADWAY KATE</horse_name> 
     <owner_name>C. Steve Larue</owner_name> 
     <program>1</program> 
     <pp>1</pp> 
     <weight>121</weight> 
    </horsedata> 
    <horsedata> 
     <horse_name>UNFAITHFUL</horse_name> 
     <owner_name>Melson, James L., Thomson, Ramona and Connell</owner_name> 
     <program>2</program> 
     <pp>2</pp> 
     <weight>121</weight> 
    </horsedata> 
    </racedata> 
    <racedata> 
     <race>2</race> 
     <todays_cls>87</todays_cls> 
     <distance>800.0</distance> 
     <country>USA</country> 
     <horsedata> 
     <horse_name>MAGNETIC START</horse_name> 
     <owner_name>Vernon D. Coyle</owner_name> 
     <program>1</program> 
     <pp>1</pp> 
     <weight>121</weight> 
     </horsedata> 
     <horsedata> 
     <horse_name>SKI POLE</horse_name> 
     <owner_name>Downunder Cable, LLC</owner_name> 
     <program>2</program> 
     <pp>2</pp> 
     <weight>121</weight> 
     </horsedata> 
    </racedata> 
</data> 
' 

クエリ:

SELECT 
    rd.value('race[1]', 'int') AS race, 
    rd.value('todays_cls[1]','int') AS todays_cls, 
    hd.value('pp[1]','int') AS pp, 
    hd.value('weight[1]','int') AS weight 
FROM @xml.nodes('data/racedata') AS B(RD) 
CROSS APPLY RD.nodes('horsedata') AS C(HD) 

出力:

enter image description here

0更新クエリに応答して

UPDATE

上記のクエリで提案されているように、あなたはhorsedata要素レベルに千切りたはず、このような何か:

SELECT 
    B.RD.query('todays_cls').value('.','varchar(max)') AS todays_cls, 
    C.HD.query('horse_name').value('.', 'varchar(max)') AS horse_name, 
    C.HD.query('jockey/jock_disp').value('.', 'varchar(max)') AS jockeyname 
FROM @xml.nodes('data/racedata') AS B(RD) 
    CROSS APPLY RD.nodes('horsedata') AS C(HD) 
+0

もしあなたのコードが動作しますしかし、レース2のデータをレース2として表示しません。自分の質問を編集して表示します。 –

+0

@DanNickはサンプルデータに2番目のレースを追加しましたが、クエリは変更されません。まだ期待される出力を示しています。 – har07

+0

ok私は間違っているのを見ます。これを方程式に追加してください:CROSS APPLY JD.value( 'jock_disp [1]'、 'varchar(100)'というselect文を使ってRD.nodes( 'horsedata/jockey')AS D(JD)AS Jockeyデータに間違った情報が表示された場合 –

関連する問題