我有几张桌子' TABLE1',' TABLE2',' TABLE3'在我的Oracle数据库中,它们之间具有参考完整性。 现在我有一张桌子' TABLE_X'有3列' parent_table',' child_table'和' order_id'。该表' TABLE_X'存储所有表格的层次结构信息< TABLE1',' TABLE2',' TABLE3'等'order_id'列对应于层次结构中的表级别。对于例如如果' TABLE5'和' TABLE4'是' TABLE3'和' TABLE3'的孩子。是孩子的两个' TABLE1'和' TABLE2'然后我们将在' TABLE_X':
中包含以下5行 parent_table child_table order_id
TABLE1 TABLE3 1
TABLE2 TABLE3 1
TABLE3 TABLE4 2
TABLE3 TABLE5 2
TABLE4 DUMMY 3
TABLE5 DUMMY 3
我想编写一个SQL或SQL脚本,它以下列列式格式提供整个输出层次结构:
TABLE1 TABLE3 TABLE4 DUMMY
TABLE2 TABLE3 TABLE4 DUMMY
--------------------------------
--------------------------------
假设最高的' order_id'是6。
答案 0 :(得分:0)
尝试:
SELECT replace( sys_connect_by_path(parent_table,'/')||'/'||child_table, '/', ' ' )
FROM TABLE11
WHERE connect_by_isleaf = 1
START WITH ORDER_ID = 1
CONNECT BY PRIOR CHILD_TABLE = PARENT_TABLE
;
=====编辑===========
你没有在问题中提到你想得到“中间组合”
只需在查询中注释一行即可获取这些值:
SELECT replace( sys_connect_by_path(parent_table,'/')||'/'||child_table, '/', ' ' )
FROM TABLE11
WHERE connect_by_isleaf = 1
--START WITH ORDER_ID = 1
CONNECT BY PRIOR CHILD_TABLE = PARENT_TABLE
;
这给出了以下输出:
TABLE1 TABLE3 TABLE4 DUMMY
TABLE1 TABLE3 TABLE5 DUMMY
TABLE2 TABLE3 TABLE4 DUMMY
TABLE2 TABLE3 TABLE5 DUMMY
TABLE3 TABLE4 DUMMY
TABLE3 TABLE5 DUMMY
TABLE4 DUMMY
TABLE5 DUMMY
答案 1 :(得分:0)
使用WITH子句的另一种方式。
with tree ( root, parent, child, path)
as
(
select parent_table,
parent_table,
child_table,
parent_table || ' ' || child_table as path
from TABLE_X
where order_id =1
union all
select t.root,
parent_table,
child_table,
path || ' ' || child_table
from tree t
left join Table_X X
on X.PARENT_TABLE = t.child
where t.parent is not null
)
select Path from tree
where parent is null
它看起来比这里提到的其他示例更复杂,但它可能几乎不需要修改其他数据库类型。