Sql 将可传递闭包表转换为邻接表
我已经实现了一个名为GRAPH_TBL的可传递闭包表。代码如下 我正在运行Oracle 11gR2 我想为我的问题提供不完整的数据而道歉。请参阅以下正确且更完整的数据: 我的桌子Sql 将可传递闭包表转换为邻接表,sql,oracle,hierarchical-data,Sql,Oracle,Hierarchical Data,我已经实现了一个名为GRAPH_TBL的可传递闭包表。代码如下 我正在运行Oracle 11gR2 我想为我的问题提供不完整的数据而道歉。请参阅以下正确且更完整的数据: 我的桌子 CREATE TABLE "GRAPH_TBL" ("PARENT_NAME" VARCHAR2(80 CHAR), "CHILD_NAME" VARCHAR2(80 CHAR), "PARENT_ID" VARCHAR2(18 CHAR), "CHILD_ID" VARCHAR2(18 CHAR), "REL
CREATE TABLE "GRAPH_TBL"
("PARENT_NAME" VARCHAR2(80 CHAR),
"CHILD_NAME" VARCHAR2(80 CHAR),
"PARENT_ID" VARCHAR2(18 CHAR),
"CHILD_ID" VARCHAR2(18 CHAR),
"RELATIVE_LEVEL" NUMBER(18,0)
);
数据:
这只是从叶级到树根的一条路径的示例。
所以这棵树从上到下看起来像这样:
Eclipse Products and Services (this is my root, also some category)
Components (some category)
Processors (some category)
Intel (some category)
Xeon 5600 (some category)
Intel Xeon E5645 2.4Ghz, 12M Cache,Turbo, HT, 1333MHz Max Mem (this is my leaf node, product)
相对级别表示类别的图形边缘:0-节点本身
1-下一个直接直接直接节点(直接父子关系)
2-一次跳过
3-两跳以上
四到三跳 相对级别>=2仅针对类别定义,而不针对叶(实际产品) 请帮助我使用SQL将其转换为邻接列表。 我的预期输出应该如下所示:
NAME ID PARENT_ID
Eclipse Products and Services a044100000171aQAAQ null
Components a044100000171bXAAQ a044100000171aQAAQ
Processors a044100000171bYAAQ a044100000171bXAAQ
Intel a044100000171bZAAQ a044100000171bYAAQ
Xeon 5600 a044100000171bdAAA a044100000171bZAAQ
Intel Xeon E5645 2.4Ghz, 12M Cache,Turbo, HT, 1333MHz Max Mem a044100000171grAAA a044100000171bdAAA
谢谢你的时间和帮助 试试这个
with tbl(PARENT_ID,CHILD_ID) as
(select 1,2 from dual union all
select 1,3 from dual union all
select 1,4 from dual union all
select 1,5 from dual union all
select 2,3 from dual union all
select 2,4 from dual union all
select 2,5 from dual union all
select 4,5 from dual
)
select
nvl(c.child_id,p.parent_id) as id
,c.parent_id
from
(select child_id,
max(parent_id) as parent_id from tbl
group by child_id
) c
full join
(select distinct parent_id as parent_id from tbl) p
on c.child_id=p.parent_id
order by id
输出
+----+-----------+
| id | PARENT_ID |
+----+-----------+
| 1 | |
| 2 | 1 |
| 3 | 2 |
| 4 | 2 |
| 5 | 4 |
+----+-----------+
说明:
第一个派生表c
,它获取max(父项)
groupbychild
。在这种情况下,您将得到child2,3,4,5
。但由于1
没有子级,因此不会在输出中给出它。要做到这一点,您需要在distinct
父id
上进行完全连接
,这样您还可以在没有子id的情况下获得父id
我们需要select子句中的nvl
或coalesce
或case
从派生表p
中获取父id
,当子id
为空时 为什么5
只有4
作为其父项?不显示1
和2
背后的逻辑是什么?谢谢您的建议!我很抱歉,但我通过提供正确的、更完整的数据纠正了我的问题。
+----+-----------+
| id | PARENT_ID |
+----+-----------+
| 1 | |
| 2 | 1 |
| 3 | 2 |
| 4 | 2 |
| 5 | 4 |
+----+-----------+