sql 知道父节点,查询所有的子节点,运用游标,递归,存储过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 知道父节点,查询所有的子节点,运用游标,递归,存储过程相关的知识,希望对你有一定的参考价值。
表tmbmBPRODchar(15)老爸BMWHSchar(2)厂号BMBOMMchar(2)methodBSEQdecimal(3,0)序号BCHLDchar(15)儿子BQREQdecimal(15,6)用量BDEFFdecimal(8,0)开始生效日期BDDISdecimal(8,0)失效日期... 表tmbm BPROD char(15) 老爸 BMWHS char(2) 厂号 BMBOMM char(2) method BSEQ decimal(3, 0) 序号 BCHLD char(15) 儿子 BQREQ decimal(15, 6) 用量 BDEFF decimal(8, 0) 开始生效日期 BDDIS decimal(8, 0) 失效日期 BMSCP decimal(5, 4) 报废率 BBUBB decimal(3, 0) bubb 展开
参考技术A 呃,因为我不清楚你的表里,这个BPRODchar(15)
老爸
里面记录的值是不是和BMWHS
对应的,所以只能说个大概。
select
sys_connect_by_path(username,'>')
"Path"
from
tmbm
start
with
id=1
connect
by
prior
id=parentid;
其中,id是你要遍历的起始点,比如你想从
厂号=XX
的这个父节点开始寻找他所有的子节点,这里就换成
start
with
BMWHS=XX
然后,connect
by
prior
id=parentid,这里id=parentid,简单解释就是寻找其他记录里,parentid和我的id相同的记录,也就是找子节点。
应该是换成你的BMWHS=BPROD(我不知道你的BPROD
BCHLD
和哪个属性是对应的,是BMWHS吗?)
如果是的话就是下面这样(username是你要返回的值,假设你还是要返回
BSEQ
序号)
select
sys_connect_by_path(BSEQ,'>')
"Path"
from
tmbm
start
with
BMWHS=XX
connect
by
prior
BMWHS=BPROD;
仅在openxml中获取指定节点的子节点
【中文标题】仅在openxml中获取指定节点的子节点【英文标题】:Getting children node only of specified node in openxml 【发布时间】:2014-08-01 03:18:13 【问题描述】:我正在将 XML 文档导入 SQL 表。它是嵌套的 xml。我需要做3张桌子。我决定使用游标。我正在使用第一个光标逐行查找主节点。它可以完美地添加到第一个表中。将其添加到表后,我只想使用另一个游标访问 FROM OPENXML 语句中的某些子节点。到目前为止,我设法读取了每个子节点数据,而不仅仅是我感兴趣的一个。你能告诉我如何只进入我正在用我的第一个光标读取的那个父节点的子节点吗?
<root>
<mainnode>
<name>Main node 1</name>
<children>
<childrenname>Children name1</childrenname>
</children>
<children>
<childrenname>Children name2</childrenname>
</children>
</mainnode>
<mainnode>
<name>Main node 2</name>
<children>
<childrenname>Children name3</childrenname>
</children>
<children>
<childrenname>Children name4</childrenname>
</children>
</mainnode>
</root>
假设这是我的带有数据的 XML 结构。我通过批量功能添加了它。我现在做的是
DECLARE @name varchar(400),
DECLARE kursor CURSOR LOCAL FORWARD_ONLY FOR SELECT name from OPENXML(@DocID, 'root/mainnode', 2)
WITH name
open kursor
FETCH NEXT FROM kursor into @name
WHILE @@FETCH_STATUS = 0
BEGIN
--here i am adding record to first table, one by one with some insert
--and also here i need to reach children elements, but only of that certain mainnode
-- thats also the place to add second kursor
DECLARE childrenname varchar(400),
DECLARE kursorchildren CURSOR LOCAL FORWARD_ONLY FOR SELECT childrenname from OPENXML(@DocID, 'root/mainnode/children', 2)
WITH childrenname
OPEN kursorchildren
FETCH NEXT FROM kursorchildren into @childrenname
WHILE @@FETCH_STATUS = 0
BEGIN
--here i want to insert into table again, but only that childrens that are from actual row, not every form document.
FETCH NEXT FROM kursorchildren into @childrenname
END
CLOSE kursorchildren
DEALLOCATE kursorchildren
FETCH NEXT FROM kursor into @name
END
CLOSE kursorClaimsMain
DEALLOCATE kursorClaimsMain
【问题讨论】:
请在您的问题中添加一些数据和表结构,也可能是示例代码,如果您添加 sqlfiddle.com 演示会更好:) 我为你添加了部分代码 【参考方案1】:尝试像这样将其选择到普通表格中:
declare @xml xml = N'<root>
<mainnode>
<name>Main node 1</name>
<children>
<childrenname>Children name1</childrenname>
</children>
<children>
<childrenname>Children name2</childrenname>
</children>
</mainnode>
<mainnode>
<name>Main node 2</name>
<children>
<childrenname>Children name3</childrenname>
</children>
<children>
<childrenname>Children name4</childrenname>
</children>
</mainnode>
</root>'
select
t.value('.','nvarchar(max)') as children_name
,t.value('(../name)[1]','nvarchar(max)') as node_name
,t.value('for $a in .. return 1+count($a/../*[. << $a])', 'int') as code_id
from @xml.nodes('root/mainnode/children') t(t)
您将获得每个主要代码和子级列表的身份。因此,您可以提取到任何您想要的表格。
【讨论】:
以上是关于sql 知道父节点,查询所有的子节点,运用游标,递归,存储过程的主要内容,如果未能解决你的问题,请参考以下文章
SQL查询父节点下的所有子节点(包括子节点下的子节点,无限子节点)