oracle中如何将拓扑结构转成树结构

ar_2002 2010-05-19 01:17:43
有表如下:

id1 id2
1 2
2 3
4 3
4 5
6 5
7 6

已知:拓扑是树结构,id1和id2表示拓扑中两个设备id,表中每行表示两个设备有连接关系。且知道id为1的设备是根节点。
求:通过上表得到如下表(pid为id的父节点)
pid id
1 2
2 3
3 4
4 5
5 6
6 7
请高手赐教,不胜感激!
...全文
108 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ar_2002 2010-05-19
  • 打赏
  • 举报
回复
再次感谢二位。结贴了。
小灰狼W 2010-05-19
  • 打赏
  • 举报
回复
替dave做个广告
来62697716群吧``
ar_2002 2010-05-19
  • 打赏
  • 举报
回复
感谢两位。不知可否留个qq。交个朋友。
ar_2002 2010-05-19
  • 打赏
  • 举报
回复
wildwave 的方法可行 谢谢了。

java3344520:您的sql我执行失败 ora-01436.想法很好。请再想想
小灰狼W 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 java3344520 的回复:]
SQL code
--那就把所有数据都颠倒过来就好了,这样可以选择你要的数据就可以 了
select a.pid,a.id
from (--对原来的字段全部做颠倒顺序,这样就可以了
select a.pid as id,a.id as pid,
from a
union all
select a.id as id,a.pid as pid,
from a
) a
start w……
[/Quote]
这个思路不错!
connect by后再加个条件就行了

SELECT *
FROM (select id1,id2 from t union all select id2,id1 from t)
START WITH id1=1
CONNECT BY id1=PRIOR id2
and id2<>prior id1
iqlife 2010-05-19
  • 打赏
  • 举报
回复
--那就把所有数据都颠倒过来就好了,这样可以选择你要的数据就可以 了
select a.pid,a.id
from (--对原来的字段全部做颠倒顺序,这样就可以了
select a.pid as id,a.id as pid,
from a
union all
select a.id as id,a.pid as pid,
from a
) a
start with a.pid=1
connect by a.pid=prior a.id
ar_2002 2010-05-19
  • 打赏
  • 举报
回复
java3344520:

如果id之间有大小关系你的方法太好了。可惜id之间没有大小关系,我例子中随手写的数据。不好意思,误导你了。请帮忙再想想
小灰狼W 2010-05-19
  • 打赏
  • 举报
回复
sql想不出好办法..
用pl sql可以解决

create table t AS(
SELECT 1 id1,2 id2 FROM dual
UNION ALL SELECT 2,3 FROM dual
UNION ALL SELECT 4,3 FROM dual
UNION ALL SELECT 4,5 FROM dual
UNION ALL SELECT 6,5 FROM dual
UNION ALL SELECT 7,6 FROM dual);

DECLARE
start_value NUMBER:=1;
v_pid NUMBER;
v_id NUMBER;
v_count number;
BEGIN
SELECT count(1) INTO v_count FROM user_tables WHERE table_name='TMP_1';
if v_count=0 then
EXECUTE IMMEDIATE 'create global temporary table tmp_1(pid number,id number) on commit preserve rows';
ELSE EXECUTE IMMEDIATE 'truncate table tmp_1';
end if;
v_id:=start_value;
loop
SELECT decode(id1,v_id,id2,id1),decode(id1,v_id,id1,id2) INTO v_id,v_pid FROM t
WHERE v_id IN(id1,id2) and (v_pid not in(id1,id2) or v_pid is null);
EXECUTE IMMEDIATE 'insert into tmp_1 values(:1,:2)' USING v_pid,v_id;
end loop;
exception
WHEN no_data_found THEN
commit;
end;
/
select * from tmp_1;

PID ID
---------------------- ----------------------
1 2
2 3
3 4
4 5
5 6
6 7

6 所选行
iqlife 2010-05-19
  • 打赏
  • 举报
回复
select a.pid,a.id
from (--想通了,,,对原来的字段顺序做下调整.把数据小的放到前面,这样就可以了
select case when a.pid-a.id>0 then a.id else a.pid end as id,
case when a.pid-a.id then a.pid else a.id end as pid from a
) a
start with a.pid=1
connect by a.pid=prior a.id
iqlife 2010-05-19
  • 打赏
  • 举报
回复
select a.pid,a.id
from (--想通了,,,对原来的字段顺序做下调整.
select case when a.pid-a.id>0 then a.id else a.pid end as id,
case when a.id-a.age>0 then a.pid else a.id end as pid from a
) a
start with a.pid=1
connect by a.pid=prior a.id
ar_2002 2010-05-19
  • 打赏
  • 举报
回复
楼上没有理解我的意思。
你给的语句是以我给的第二个表为基础的。
我现在的问题如何通过第一个表得到第二个表。原始数据没有问题。
iqlife 2010-05-19
  • 打赏
  • 举报
回复
select a.pid,a.id
from a
start with a.pid=1
connect by a.pid=prior a.id

顺便说下,你给点原始数据有问题,得不到你要的结果
内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同时推荐参考文提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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