选择使用嵌套节点的xquery

时间:2010-10-12 17:09:19

标签: xml sql-server-2008

我尝试使用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

我尝试了不同的方式,但我没有找到好的结果!

感谢。

1 个答案:

答案 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)
相关问题