怎样SQL实现根据树根找它所有的叶子?

北极海hein 2005-01-10 05:09:56
怎样SQL实现根据树根找它所有的叶子?
例如:
Table如下:
level part_no component_part
===============================================
1 CC026-0203A SC026-0203-1A
1 CC026-0203A SC026-0203-2A
2 SC026-0203-1A MAALU-082
2 SC026-0203-2A SC026-0203-1A
3 SC026-0203-1A MAALU-082

我想要的结果是这样:
part_no component_part
==================================
CC026-0203A MUALU-0823
CC026-0203A MAALU-082

怎样用SQL来实现?
...全文
169 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
北极海hein 2005-01-11
  • 打赏
  • 举报
回复
这个问题例子就相当于一棵树.
A
/ \
B C
/ \
D E
\
F

我要找的就是树根A下面的所以叶子(D,F),这个算法不知怎样写.
若能够用function根据树根找到所以叶子也可以.
zealot_zk 2005-01-11
  • 打赏
  • 举报
回复
如果,只找一层的子节点可以按照一楼的说法来作,就像在员工表中找出所有用户的经理一样,如果是给定任意节点,找出所有的子节点,那就麻烦很多了
progrose 2005-01-11
  • 打赏
  • 举报
回复
用sp解决的? sp什么东西?
GerryYang 2005-01-11
  • 打赏
  • 举报
回复
select id ,levelid from t start with id='b' connect by prior id=parid

zmgowin 2005-01-11
  • 打赏
  • 举报
回复
应该很简单啊,for example:
13:17:20 SQL> desc t;
名称 空? 类型
----------------------------------------- -------- ----------------------------

ID CHAR(1)
PARID CHAR(1)

13:17:58 SQL> select * from t;
a
b a
c a
d b
e c
f e

已选择6行。

已用时间: 00: 00: 00.00
13:18:03 SQL> select id from t start with id='b' connect by prior id=parid
13:18:07 2 minus
13:18:07 3 select parid id from t start with id='b' connect by prior id=parid
;
d

已用时间: 00: 00: 00.00
13:18:07 SQL> select id from t start with id='a' connect by prior id=parid
13:18:16 2 minus
13:18:16 3 select parid id from t start with id='a' connect by prior id=parid
;
d
f

已用时间: 00: 00: 00.00
everydream 2005-01-10
  • 打赏
  • 举报
回复
楼主说的应该是一个产品BOM展开的问题吧,一个SQL语句搞定,不可能吧,一般的软件都是用sp解决的!
bzszp 2005-01-10
  • 打赏
  • 举报
回复
你给的数据有问题

SQL> select * from temp;

LEV PART_NO COMPONENT_PART
--------- -------------------- --------------------
1 CC026-0203A SC026-0203-1A
1 CC026-0203A SC026-0203-2A
2 SC026-0203-1A MAALU-082
2 SC026-0203-2A SC026-0203-3A
3 SC026-0203-3A MAALU-083

SQL> select * from (
2 select temp.* from temp start with PART_NO='CC026-0203A'
3 connect by prior component_part=part_no)
4 t where component_part not in(select part_no from temp start with PART_NO='CC026-0203A'
5 connect by prior component_part=part_no);

LEV PART_NO COMPONENT_PART
--------- -------------------- --------------------
2 SC026-0203-1A MAALU-082
3 SC026-0203-3A MAALU-083

SQL> select 'CC026-0203A' part_no,component_part from (
2 select temp.* from temp start with PART_NO='CC026-0203A'
3 connect by prior component_part=part_no)
4 t where component_part not in(select part_no from temp start with PART_NO='CC026-0203A'
5 connect by prior component_part=part_no);

PART_NO COMPONENT_PART
----------- --------------------
CC026-0203A MAALU-082
CC026-0203A MAALU-083

SQL>

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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