Oracle层次结构数据表示歧​​义

Viv*_*l21 2 oracle10g

我在下面的结构中有一张桌子.

_________________________________
|| ExpObjkey   Exp1    Exp2  operator||
________________________________
    1            2        3    +
    2            4        5    +
    3            6        7    -
Run Code Online (Sandbox Code Playgroud)

我希望按以下顺序记录:
对于expObjKey = 1,我们将拥有

ExpObjKey Expression
   1       (4+5)+(6-7)      
Run Code Online (Sandbox Code Playgroud)

说明:

for ExpObjKey 1 we will have 2 +3
then 2 will have 4+5
and 3 will have 6+7.
Run Code Online (Sandbox Code Playgroud)

它更像是一个层次结构.

我已经尝试了很多可能的方法,但没有接近解决方案.

 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
Run Code Online (Sandbox Code Playgroud)

Ale*_*ole 5

我不认为你可以通过分层查询来做到这一点,但我有兴趣被证明是错误的.您需要从树的底部开始,然后继续努力以允许替换发生; 但是,似乎没有办法组合产生的部分表达式.有可能使用递归子查询因子,但直到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))                  
Run Code Online (Sandbox Code Playgroud)

SQL小提琴.

如果需要,可以使用trim或regexp_replace去除外括号,但它们可能是可接受的.

如果你添加另一个图层,说一个带有值的记录7, 8, 9, '*',这将给出:

EXPRESSION                   
------------------------------
((4+5)+(6-(8*9)))              
Run Code Online (Sandbox Code Playgroud)

SQL小提琴.

但是对于大型数据集来说这不会非常有效,因为它会进行大量的单行查找.