我试图在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
在这个例子中,我有:
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;
提前感谢您的帮助。
答案 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
表中?