Siv*_*ran 4 xml sql t-sql sql-server
<people>
<parent>
<parent-name> joel </parent-name>
<child> john </child>
<child> sara </child>
<child> ram </child>
</parent>
<parent>
<parent-name> sam </parent-name>
<child> david </child>
<child> george </child>
<child> wilson </child>
</parent>
</people>
Run Code Online (Sandbox Code Playgroud)
所需的输出是:
parent | child
--------|---------
joel | john
joel | sara
joel | ram
sam | david
sam | george
sam | wilson
Run Code Online (Sandbox Code Playgroud)
我尝试了以下SQL查询来检索所有父级的所有子级元素,只有我可以获取第一个子级元素
select a.b.value('parent-name[1]','varchar(50)') as parent
, a.b.value('child[1]' ,'varchar(50)') as child
from @myxml.nodes('people/parent')a(b)
Run Code Online (Sandbox Code Playgroud)
您需要在每个父节点的节点上使用CROSS APPLY和:.nodes()<child>
SELECT
a.b.value('(parent-name)[1]', 'varchar(50)') as parent,
XChild.value('.' ,'varchar(50)') as child
FROM
@myxml.nodes('people/parent') AS a(b)
CROSS APPLY
b.nodes('child') AS XTbl(XChild)
Run Code Online (Sandbox Code Playgroud)
这将使所有父母及所有子女返回。
诀窍是迭代子级,然后上一级并获取父级名称。
select a.b.value('(../parent-name)[1]','varchar(50)') as parent
, a.b.value('(.)[1]' ,'varchar(50)') as child
from @myxml.nodes('people/parent/child')a(b)
Run Code Online (Sandbox Code Playgroud)