用于查找表

时间:2015-12-15 16:59:39

标签: sql database oracle

我有几张桌子' 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。

2 个答案:

答案 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

它看起来比这里提到的其他示例更复杂,但它可能几乎不需要修改其他数据库类型。