Sql Oracle递归联接-多对多关系

Sql Oracle递归联接-多对多关系,sql,oracle,Sql,Oracle,我已经尝试了几个小时,但没有成功,递归地将一个表连接到它自己。这可能是最简单的SQL问题,而不是我试图解释链接关系: 在上面的示例中,实际数据可能嵌套多达5层,甚至更多。我想写一个查询来处理任意数量层的连接 通过执行一些搜索,似乎可以使用CONNECT BY PREVIOR和其他方法递归地连接数据。我只是没能让它工作。如果你的一位大师能告诉我这是怎么做的,那就太棒了。从SQL Fiddle复制你的表供其他人查看,以防将来外部链接失效: * DEVICE TABLE DEVICEID DEVICE

我已经尝试了几个小时,但没有成功,递归地将一个表连接到它自己。这可能是最简单的SQL问题,而不是我试图解释链接关系:

在上面的示例中,实际数据可能嵌套多达5层,甚至更多。我想写一个查询来处理任意数量层的连接


通过执行一些搜索,似乎可以使用CONNECT BY PREVIOR和其他方法递归地连接数据。我只是没能让它工作。如果你的一位大师能告诉我这是怎么做的,那就太棒了。

从SQL Fiddle复制你的表供其他人查看,以防将来外部链接失效:

* DEVICE TABLE
DEVICEID DEVICENAME
-------------------
1        Device1
2        Device2
3        Device3
4        Device4
5        Device5
6        Device6
7        Device7
8        Device8
9        Device9
10       Device10

* CONNECTION TABLE
IDPARENT IDCHILD
----------------
1        2
3        4
4        5
6        7
7        8
4        8
4        8
5        9
我不知道您到底想从表中查询哪些数据,但如果您只关心使用connect by PREVIOR进行的自连接,请看:

select distinct d.deviceid, d.devicename, connect_by_root(deviceid) rootdeviceid
from device d
    left join connection c on (d.deviceid = c.idchild)
connect by prior d.deviceid = c.idparent
start with c.idparent is null
order by d.deviceid

请注意,给定您提供的表,此查询返回11行-这是因为设备8在您提供的层次结构中实际上有两个根节点,即3和6。

谢谢。这个查询对于我想处理数据的一些事情来说可能很方便。在某些情况下,我希望有多个根节点,因此结果与预期的一样。是否可以显示整个树的列,包括中间设备?希望结果类似于SQLFIDLE上的-Join 2层深度查询,太长,无法在评论中发布。啊,这非常接近:选择d.deviceid、d.devicename、connect_by_rootdeviceid rootdeviceid、SYS_connect_by_PATHdeviceid、'/'Path、SYS_connect_by_PATHDeviceName、,来自设备d的“/”路径名左连接d.deviceid=c上的c.idchild连接由先前的d.deviceid=c.idparent以c开头。idparent按d.deviceid为空顺序