Oracle 一个较为复杂的查询sql有关问题

Oracle 一个较为复杂的查询sql问题
两张表

线 LINE
字段:
line_id、start_surface_id、end_surface_id
线的ID、开始面ID、结束面ID

面 SURFACE
surface_id

如何循环查询出所有和中心面关联的线和面?
已知中心面的surface_id为1。

类似下面截图,需要查询出中心面、A、B、C、D、E、F
G、H不需要查询。

start_surface_id、end_surface_id 没有方向限制,可以从A-B,也可以是B-A。
如何一句话查询出所有与中心面相关的线和面的所有数据。

Oracle 一个较为复杂的查询sql有关问题
------解决方案--------------------
引用:
两张表

线 LINE
字段:
line_id、start_surface_id、end_surface_id
线的ID、开始面ID、结束面ID

面 SURFACE
surface_id

如何循环查询出所有和中心面关联的线和面?
已知中心面的surface_id为1。

类似下面截图,需要查询出中心面、A、B、C、D、E、F
G、H不需要查询。

start_surface_id、end_surface_id 没有方向限制,可以从A-B,也可以是B-A。
如何一句话查询出所有与中心面相关的线和面的所有数据。

Oracle 一个较为复杂的查询sql有关问题

你自己再和 SURFACE通过ID连接一下:

WITH t1 AS

SELECT 'l1' line_id,'1' start_surface_id,'A' end_surface_id FROM dual UNION ALL 
SELECT 'l2' line_id,'1' start_surface_id,'B' end_surface_id FROM dual UNION ALL 
SELECT 'l3' line_id,'B' start_surface_id,'C' end_surface_id FROM dual UNION ALL 
SELECT 'l4' line_id,'C' start_surface_id,'D' end_surface_id FROM dual UNION ALL 
SELECT 'l5' line_id,'1' start_surface_id,'E' end_surface_id FROM dual UNION ALL 
SELECT 'l6' line_id,'1' start_surface_id,'F' end_surface_id FROM dual UNION ALL 
SELECT 'l7' line_id,'G' start_surface_id,'H' end_surface_id FROM dual )
SELECT distinct(t.end_surface_id) FROM (
SELECT * FROM t1
START WITH t1.start_surface_id='1'
CONNECT BY PRIOR t1.end_surface_id=t1.start_surface_id) t
ORDER BY T.END_SURFACE_ID

------解决方案--------------------
楼上说的不错。
这种是典型的树形结构,把开始面和结束面分别看成父节点和子节点就可以了。
用start with ... connect by prior ... 级联查询即可。