Oracle递归连接 - 多对多关系

时间:2014-08-01 04:46:23

标签: sql oracle

我已经尝试了几个小时而没有成功,以递归方式加入一张桌子。在这个SQL小提琴中看到问题可能最简单,而不是我试图解释链接关系:

http://sqlfiddle.com/#!4/367c3/14

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

通过进行一些搜索,似乎可以使用CONNECT BY PRIOR以及其他方法递归地加入数据。我只是没有能够让它发挥作用:(。如果你们中的一个大师可以告诉我它是如何完成的,那就太棒了。

1 个答案:

答案 0 :(得分:1)

将表格从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

我不知道你想从表中查询到什么数据,但是如果你只关心使用先前连接的自我“加入”,那么你可以去:

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。