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