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

时间:2014-08-15 15:54:34

标签: oracle10g

我在下面的结构中有一张表。

_________________________________
|| 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

1 个答案:

答案 0 :(得分: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))                  

SQL Fiddle

如果您愿意,可以使用trim或regexp_replace去除外括号,但它们可能是可接受的。

如果添加另一个图层,请说出值为7, 8, 9, '*'的记录,则会显示:

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

SQL Fiddle

但是这对大型数据集来说效率不高,因为它会进行大量的单行查找。