我有这个xml文件,所有其余节点都依赖于第一个节点。我创建了一个树形图来帮助说明它。
我遇到的问题是每个节点都依赖于第一个节点,但它们没有任何相互链接的列。
这是指向的链接 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)
答案 0 :(得分:1)
对第一个结果执行第二次CROSS APPLY
,以便获得与当前<horsedata>
对应的<racedata>
个元素。请参阅下面的工作演示示例。
示例数据:
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)
输出
更新
为了响应更新的查询,您应该按照上述查询中的建议在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)