Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将可传递闭包表转换为邻接表_Sql_Oracle_Hierarchical Data - Fatal编程技术网

Sql 将可传递闭包表转换为邻接表

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

我已经实现了一个名为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), 
"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(父项)
groupby
child
。在这种情况下,您将得到child
2,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 |
+----+-----------+