我在下面的结构中有一张表。
_________________________________
|| 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
答案 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))
如果您愿意,可以使用trim或regexp_replace去除外括号,但它们可能是可接受的。
如果添加另一个图层,请说出值为7, 8, 9, '*'
的记录,则会显示:
EXPRESSION
------------------------------
((4+5)+(6-(8*9)))
但是这对大型数据集来说效率不高,因为它会进行大量的单行查找。