有一张表LINE,结构如下:
LINE_ID POINT1_ID POINT2_ID
1 0 1
2 1 2
4 2 3
该表存储了一系列的线段的两个端点的ID,表中各线段首尾相连会组成一条长的线段(可能会有环路),以测试数据为例,line1、line2、line3、line4、line5组成了一条完整的线段链。
现在知道完整线段链的起至点ID,需要用一条SQL语句查询出整个线段链各点的列表(以连接顺序排序),如:
index point_id
1 0
2 1
3 2
4 3该问题难点有两个
1> 线段是没有方向的,即实际存储数据可能是这样
LINE_ID POINT1_ID POINT2_ID
1 0 1
2 2 1
3 2 32> 可能存在环路,即可能有这样的数据
LINE_ID POINT1_ID POINT2_ID
1 0 1
2 1 2
3 1 3
4 2 4
5 3 4我用的数据库是Oracle10g,需要用一条SQL得到结果,不希望使用存储过程或函数。
LINE_ID POINT1_ID POINT2_ID
1 0 1
2 1 2
4 2 3
该表存储了一系列的线段的两个端点的ID,表中各线段首尾相连会组成一条长的线段(可能会有环路),以测试数据为例,line1、line2、line3、line4、line5组成了一条完整的线段链。
现在知道完整线段链的起至点ID,需要用一条SQL语句查询出整个线段链各点的列表(以连接顺序排序),如:
index point_id
1 0
2 1
3 2
4 3该问题难点有两个
1> 线段是没有方向的,即实际存储数据可能是这样
LINE_ID POINT1_ID POINT2_ID
1 0 1
2 2 1
3 2 32> 可能存在环路,即可能有这样的数据
LINE_ID POINT1_ID POINT2_ID
1 0 1
2 1 2
3 1 3
4 2 4
5 3 4我用的数据库是Oracle10g,需要用一条SQL得到结果,不希望使用存储过程或函数。
解决方案 »
- java连接oracle
- 咨询LINUX下安装oracle问题
- oralce 优化 请高手指教
- Oracle 8i 数据恢复问题
- 关于联接的问题.
- 英文版win2000server上可以安装简体中文版的oracle9i吗
- oracle如何解开被锁定的单条记录
- 请问NVARCHAR2 与VARCHAR2有什么区别?? 为何用了NVARCHAR2字段时,插入数据报字符集不对的错?
- Oracle中采用expdp 导出的表空间 删除表空间后采用impdp导入报错
- Oracle MRP如何考虑同一物料编码出现两个Lead time
- 以用户指定的格式复制一个数据文件至数据库表中
- 相对复杂的竖表转横表+动态时间比较
select index from tablename
connect by prior point1_id = point2_id
start with index = 起点INDEX。
可是如果存在环路就不行了。
select 1 lineid, 0 point1, 1 point2 from dual
union all select 2,1,2 from dual
union all select 3,1,3 from dual
union all select 4,2,4 from dual
union all select 5,3,4 from dual
union all select 6,4,1 from dual )select lineid from linklist
start with lineid=1
connect by nocycle point1 = prior point2;
from
(select line_id,
case when point1_id>point2_id then point2_id else point1_id end as point1_id,
case when point1_id>point2_id then point1_id else point2_id end as point2_id
from line)
start with point1_id=0
connect by prior point1_id=point2_id
/