【发布时间】:2016-03-06 16:20:27
【问题描述】:
我在表 object_type_t 中的数据集如下所示:
OBJ_ID PARENT_OBJ OBJECT_TYPE OBJECT_DESC
--------- ------------ ------------- -----------------------
ES01 <null> ESTATE Bucks Estate
BUI01 ES01 BUILDING Leisure Centre
BUI02 ES01 BUILDING Fire Station
BUI03 <null> BUILDING Housing Block
SQ01 BUI01 ROOM Squash Court
BTR01 BUI02 ROOM Bathroom
AP01 BUI03 APARTMENT Flat No. 1
AP02 BUI03 APARTMENT Flat No. 2
BTR02 AP01 ROOM Bathroom
BDR01 AP01 ROOM Bedroom
BTR03 AP02 ROOM Bathroom
SHR01 BTR01 OBJECT Shower
SHR02 BTR02 OBJECT Shower
SHR03 BTR03 OBJECT Shower
在实际的分层术语中,看起来像这样:
ES01
|--> BUI01
| |--> SQ01
|--> BUI02
| |--> BTR01
|--> SHR01
=======
BUI03
|--> AP01
| |--> BTR02
| | |--> SHR02
| |--> BDR01
|--> AP02
|--> BTR03
|--> SHR03
我知道如何使用分层查询,例如CONNECT BY PRIOR。我也知道如何通过connect_by_root 找到树的根。但我要做的是找到树的给定“级别”(即不是根级别,而是给定对象的“BUIDLING”级别)。
例如,我希望能够查询出层次结构中属于BUI01的每个对象。
然后反过来,给定一个对象 ID,我希望能够查询出该对象的关联(例如)ROOM object_id。
如果我可以将每个OBJECT_TYPE 与给定的level 关联起来,事情会容易得多。但是从上面的例子可以看出,BUILDING 并不总是出现在层次结构的第 1 级。
我最初的想法是将数据获取为中间表格格式(可能是物化视图),如下所示。这将允许我通过物化视图上的简单 SQL 查询找到我想要的数据:
OBJ_ID OBJECT_DESC ESTATE_OBJ BUILDING_OBJ ROOM_OBJ
--------- ---------------- ---------- ------------ ----------
ES01 Bucks Estate ES01
BUI01 Leisure Centre ES01 BUI01
BUI02 Fire Station ES01 BUI02
BUI03 Housing Block BUI03
SQ01 Squash Court ES01 BUI01 SQ01
BTR01 Bathroom ES01 BUI02 BTR01
AP01 Flat No. 1 BUI03
AP02 Flat No. 2 BUI03
BTR02 Bathroom BUI03 BTR02
BDR01 Bedroom BUI03 BDR01
BTR03 Bathroom BUI03 BTR03
SHR01 Shower ES01 BUI02 BTR01
SHR02 Shower BUI03 BTR02
SHR03 Shower BUI03 BTR03
但是(我想避免编写 PL/SLQ),我无法简明地构造一个可以实现这种表格格式的查询。
有人知道我该怎么做吗?能做到吗?
解决方案必须在 Oracle 12c 中可执行。
另外:性能很重要,因为我的底层数据结构包含几十万行,而且结构可能很深。因此,更快的解决方案将优于较慢的解决方案:-)
提前感谢您的帮助。
【问题讨论】: