Oracle10g Oracle层次结构数据表示模糊性

Oracle10g Oracle层次结构数据表示模糊性,oracle10g,Oracle10g,我有一张如下结构的桌子 _________________________________ || ExpObjkey Exp1 Exp2 operator|| ________________________________ 1 2 3 + 2 4 5 + 3 6 7 - 我希望记录的顺序如下: 对于expObjKey=1,我们将 E

我有一张如下结构的桌子

_________________________________
|| ExpObjkey   Exp1    Exp2  operator||
________________________________
    1            2        3    +
    2            4        5    +
    3            6        7    -
我希望记录的顺序如下:
对于expObjKey=1,我们将

ExpObjKey Expression
   1       (4+5)+(6-7)      
说明:

for ExpObjKey 1 we will have 2 +3
then 2 will have 4+5
and 3 will have 6+7.
它更像是一种等级制度

我尝试了很多可能的方法,但都没有找到解决办法

 SELECT expObjkey,  SYS_CONNECT_BY_PATH(exp1||' ' ||operator|| exp2||')', ' (  ') "Path"
 FROM bpmn_expression 
 CONNECT BY PRIOR   
 exp1=expObjkey   or exp2=expObjkey   
start with expObjkey=1

我不认为你能用分层查询做到这一点,但我有兴趣被证明是错误的。你需要从树的底部开始,一路向上,让替换发生;但是,似乎没有一种方法可以组合生成的部分表达式。递归子查询分解可能是可行的,但直到11gR2才可用

在10g上,您可以使用自己的递归函数生成所需的内容:

create or replace function get_expression(p_key bpmn_expression.expobjkey%type)
return varchar2 is
  row bpmn_expression%rowtype;
begin
  select * into row from bpmn_expression where expobjkey = p_key;
  return '(' || get_expression(row.exp1)
    || row.operator || get_expression(row.exp2) || ')';
exception
  when no_data_found then
    return to_char(p_key);
end;
/

select get_expression(1) as expression from dual;

EXPRESSION                   
------------------------------
((4+5)+(6-7))                  

如果愿意,可以使用trim或regexp_replace去除外圆括号,但也可以接受

如果添加另一个层,比如一个值为
7,8,9'*'
的记录,则会给出:

EXPRESSION                   
------------------------------
((4+5)+(6-(8*9)))              


但是,对于大型数据集,这并不是非常有效,因为它将执行大量单行查找。

深度可以达到n级。当然,实际情况比这更复杂。上面的过程是按照我的要求返回准确的输出。