[挑战]请教关于貌似递归的sql的写法

ChenSu2008 2006-08-18 11:14:15
各位达人,问个问题。

我的表结构大概如此
NodeID // 当前node
StructureID //
ParentID // 父node
ParentType // 都是0
ChildID // 子node
ChildType // 0:Composite 1:Leaf
OrderNo
最顶端的那个NodeID的ParentID是0
这个表会跟据结构生成一个形如
node004
++node 003
node 001
++node 008
++node 002
node 009
这样结构的东西


给一个begin node 和一个 end node, 求出包含其中所有的node
比如上面给出node 001和node 009 要得到node 001, node 008, node 002, node 009这四个node.

提供点思路,或给点sql, 将不盛感激。
...全文
290 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2006-08-18
  • 打赏
  • 举报
回复
上面是sql 2005中的实现示例.

你可以修改查询中的 001 和 003 为指定的开始和结束的nodeid
zjcxc 元老 2006-08-18
  • 打赏
  • 举报
回复
USE tempdb

CREATE TAble tb(
NodeID char(3), --// 当前node
ParentID char(3) --// 父node
)
INSERT tb SELECT '004', '0'
UNION ALL SELECT '003', '004'
UNION ALL SELECT '001', '0'
UNION ALL SELECT '008', '001'
UNION ALL SELECT '002', '001'
UNION ALL SELECT '009', '0'
GO

WITH
T1 AS(
SELECT *,
Level = 1,
Path = CONVERT(varchar(max), NodeID)
FROM tb
WHERE ParentID = '0'
UNION ALL
SELECT A.*,
Level = B.Level + 1,
Path = CONVERT(varchar(max), B.Path + A.NodeID)
FROM tb A, T1 B
WHERE A.ParentID = B.NodeID
),
T2 AS(
SELECT *, RowNumber = ROW_NUMBER() OVER(ORDER BY Path)
FROM T1
)
SELECT NodeID, ParentID
FROM T2
WHERE RowNumber BETWEEN
(SELECT RowNumber FROM T2 WHERE NodeID = '001') -- 001 begin nodeid
AND
(SELECT RowNumber FROM T2 WHERE NodeID = '003') -- 003 end nodeid
GO

DROP TABLE tb
spring_504 2006-08-18
  • 打赏
  • 举报
回复
刚才表达的意思可能不是很对,现在重新说一下
思路基本上可以说是
前提:保证开始节点在结束结点前面
1,找出两个节点共同的祖先root或者null
2,循环从开始节点到root,对这条路径中的每一个节点都选出该层大于该order的节点(同一个父节点下的)
3,循环从root到结束节点,对这条路径中的每一个节点都选出该层小于该order的节点(同一个父节点下的)
ChenSu2008 2006-08-18
  • 打赏
  • 举报
回复
多谢,表的结构是不能改的。
spring_504 2006-08-18
  • 打赏
  • 举报
回复
不好意思
小于的话,应该对它的子节点的level与结束节点的level进行判断,具体的就不写了
spring_504 2006-08-18
  • 打赏
  • 举报
回复
只有一个思路,感觉好像是你要表达的意思
spring_504 2006-08-18
  • 打赏
  • 举报
回复
你的表需要一下数据,节点号(nodeId),父节点号(pnodeId),层次号(level)(最好有),该父节点下的顺序(order)

输入条件开始节点(startnodeId),结束节点(endnodeId)

根据startnodeId首先得到它的父节点下大于startnodeId的order的节点,
然后循环比较startnodeId与endnodeId的level大小,
大于的话,startnodeId的父节点当成开始节点;选出大于父节点order的节点,判断startnodeId的父节点的level与endnodeId的level的大小,继续循环;
等于的话,取出开始节点和结束节点order之间的所有节点
小于的话,结束;
ChenSu2008 2006-08-18
  • 打赏
  • 举报
回复
对不起各位,那个结构描述的有点问题。
在同一阶层的话,那个node 001因该是在node004前面
所以应该是形如
node 001
++node 002
++node 008
node004
++node 003
node 009
的结构,各位不要打我呀,我也是一时心激了。
ChenSu2008 2006-08-18
  • 打赏
  • 举报
回复
to:libin_ftsafe
规则应该是根据那张表里的ParentID ParentType ChildID ChildType
别人做好了的东西,没办法看的,郁闷的,基本靠猜,所以才来请教达人了。
ChenSu2008 2006-08-18
  • 打赏
  • 举报
回复
to:spring_504(土人)
其实那个结构是个部门的结构,可以随便在某个地方插入部门的。
所以才有这样的结构。

而我要去找被选中的部门的人员。

to:fcuandy()
请见谅,呵呵,本来以为会像其他版一样的,需要点战斗意识。
licry01 2006-08-18
  • 打赏
  • 举报
回复
你描述的逻辑有点问题,能再清楚些不?
如下数据:

node004
++node 003
++++++++node 031

node 001
++node 008
++++++++node 081
++node 002
++++++++node 021

比如,begin=002, end = 008 , 要得到什么样的结果?
比如,begin=008, end = 002 , 要得到什么样的结果?
比如,begin=001, end = 002 , 要得到什么样的结果?
比如,begin=002, end = 001 , 要得到什么样的结果?
...........................
...........................
...........................
能把begin 和 end 之间的关系和约束说得详细点不?
spring_504 2006-08-18
  • 打赏
  • 举报
回复
明白你的意思了,但是你的树在每一层的排序是怎么表示的
子陌红尘 2006-08-18
  • 打赏
  • 举报
回复
这个表会跟据结构生成一个形如
node004
++node 003
node 001
++node 008
++node 002
node 009
这样结构的东西

----------------------------------------------------------------
规则是什么?为何会形成这样的排序?
spring_504 2006-08-18
  • 打赏
  • 举报
回复
父子关系是怎么体现出来的?begin node 和 end node 是什么关系?其中的节点是什么意思?是不是它们的所有子节点
ChenSu2008 2006-08-18
  • 打赏
  • 举报
回复
node 003是node 004 的子节点
node 008 ,node 002 是 node 001子节点

也有可能给出node 003和node 008求出node 003, node 001, node 001, node 008
就像拿个鼠标多选,要选中其中的节点。

多谢关注。
fcuandy 2006-08-18
  • 打赏
  • 举报
回复
别用这种标题了,看到"挑战"两字就..
spring_504 2006-08-18
  • 打赏
  • 举报
回复
这个表会跟据结构生成一个形如
node004
++node 003
node 001
++node 008
++node 002
node 009
这样结构的东西

这个是什么?表里面的数据吗?它们之间有没有什么关系?
ChenSu2008 2006-08-18
  • 打赏
  • 举报
回复
node001和node009不是
node 001和node 008 是的
子陌红尘 2006-08-18
  • 打赏
  • 举报
回复
node001和node009不是父子关系?
ChenSu2008 2006-08-18
  • 打赏
  • 举报
回复
非常感谢各位达人,特别是zjcxc(邹建),呵呵。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧