我尝试使用xquery从xml文档返回一组结果,但我没弄明白。
以下是我的疑问:
DECLARE @Data xml
SET @Data='<main>
<person>
<name>Daniel</name>
<cars>
<model>y75</model>
<model>b25</model>
</cars>
</person>
<person>
<name>Marc</name>
<cars>
<model>h20</model>
</cars>
</person>
</main>'
SELECT x.value('name[1]','nvarchar(max)') name,
x.value('cars[1]','nvarchar(max)') car
FROM @Data.nodes('//main/person') AS e(x)
-- Returns:
-- Name Car
------------------
-- Daniel y75b25
-- Marc h20
我想表明:
Name Car
Daniel y75
Daniel b25
Marc h20
我尝试了不同的方式,但我没有找到好的结果!
感谢。
答案 0 :(得分:2)
您必须将所有模型投影为行(使用.nodes()
),然后向上导航以提取该人:
SELECT x.value('../../name[1]','nvarchar(max)') name,
x.value('.','nvarchar(max)') car
FROM @Data.nodes('//main/person/cars/model') AS e(x)
更新
如果你想要归还没有汽车的人,那么你必须使用.nodes()
方法两次:一次为人,然后再为每个人提供汽车。 OUTER APPLY
运算符将执行您需要的“外连接”:
SELECT e.x.value('name[1]','nvarchar(max)') name,
c.x.value('.','nvarchar(max)') car
FROM @Data.nodes('//main/person') AS e(x)
outer apply e.x.nodes('./cars/model') as c(x)