【问题标题】:Selecting parent and children values of XML together一起选择 XML 的父值和子值
【发布时间】:2011-02-04 12:41:32
【问题描述】:

尝试从 XML 中同时检索父值和子值时遇到问题。代码如下所示,但每个父母只能检索 1 个孩子。如何选择父级的所有子级?


declare @x xml;

set @x = '
    <Parent ParentID="1" ParentName="Mary">
        <Child ChildID="2" ChildName="Paul" />
        <Child ChildID="3" ChildName="Alan" />
        <Child ChildID="4" ChildName="David" />
    </Parent>
    <Parent ParentID="5" ParentName="James">
        <Child ChildID="6" ChildName="Amy" />
        <Child ChildID="7" ChildName="Julie" />
    </Parent>
';

select 
tbl.col.value('@ParentID', 'int') AS ParentID,
tbl.col.value('@ParentName', 'varchar(50)') AS ParentName,
tbl.col.value('Child[1]/@ChildID[1]', 'int') AS ChildID,
tbl.col.value('Child[1]/@ChildName[1]', 'varchar(50)') AS ChildName
from @x.nodes('/Parent') as tbl(col);

我得到以下结果,但希望父节点为每个子节点重复。


ParentID   ParentName   ChildID  ChildName
1          Mary         2        Paul
5          James        6        Amy

问题是孩子[1],但我不知道如何解决它。我尝试了 sql-variable 但也无法让它工作。理想情况下,我希望看到以下内容:


ParentID   ParentName   ChildID  ChildName
1          Mary         2        Paul
1          Mary         3        Alan
1          Mary         4        David
5          James        6        Amy
5          James        7        Julie

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: sql-server xml


    【解决方案1】:
    select 
    tbl.col.value('parent::*/@ParentID', 'int') AS ParentID,
    tbl.col.value('parent::*/@ParentName', 'varchar(50)') AS ParentName,
    tbl.col.value('@ChildID', 'int') AS ChildID,
    tbl.col.value('@ChildName', 'varchar(50)') AS ChildName
    from @x.nodes('/Parent/Child') as tbl(col);
    

    【讨论】:

      【解决方案2】:

      试试下面的代码:

          select 
          tbl.col.value('@ParentID', 'int') AS ParentID,
          tbl.col.value('@ParentName', 'varchar(50)') AS ParentName,
          p.j.value('@ChildID[1]', 'int') AS ChildID,
          p.j.value('@ChildName[1]', 'varchar(50)') AS ChildName
          from @x.nodes('/Parent') as tbl(col)
          cross apply tbl.col.nodes('Child') as p(j)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        相关资源
        最近更新 更多