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级。当然,实际情况比这更复杂。上面的过程是按照我的要求返回准确的输出。