Oracle上的分层查询

时间:2014-07-24 11:59:57

标签: sql oracle

我试图在Oracle上编写一个涉及两个表的分层查询:

GeoNodes
Name, uuid, lat, lon

GeoParents
parent_uuid, child_uuid

示例数据:

GeoNodes
Name    UUID  lat  lon
test1   123   0    0
test2   124   0    0
test3   125   0    0
test4   126   0    0

GeoParents
parent_uuid   child_uuid
123           124
123           125
124           126

在这个例子中,我有:

  • test2 parent2和test3
  • test2 test4的父母

geoparents表中没有空值。在地理亲属上,在uuid geonode列上有两个FK(一个用于子节点,一个用于父节点),用于维护两个表之间的数据完整性。

正如您所看到的,父和子之间的链接保留在外部表上。 为了给所有人带来更多的复杂性,一些节点有多个父节点。

遗憾的是,我不知道将连接放在查询中的哪个位置以使其正常工作。我已搜索过示例,但所有示例都在数据表中都有父列。

这是唯一提取一些全等数据的查询,但遗憾的是无法获取根记录:

select Lpad(soc || '_' || name,Length(soc || '_' || name) + LEVEL * 3 - 3,'-') 
from geonodes g, geoparents p
where g.uuid = p.child_uuid
start with name = 'myTest'
connect by prior g.uuid = p.PARENT_UUID
order siblings by name;

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

首先,构建树:

SELECT child_uuid uuid
FROM   geoparents
CONNECT BY PRIOR child_uuid = parent_uuid
START WITH parent_uuid IS NULL;

然后你可以在表格中加入信息:

SELECT *
FROM (SELECT child_uuid uuid
      FROM   geoparents
      CONNECT BY PRIOR child_uuid = parent_uuid
      START WITH parent_uuid IS NULL) tree,
      geonodes
WHERE tree.uuid = geonodes.uuid;

但我认为你不需要有两张桌子。什么阻止您将parent_uuid存储在geonodes表中?