首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle层次数据表示歧义

Oracle层次数据表示歧义
EN

Stack Overflow用户
提问于 2014-08-15 15:54:34
回答 1查看 151关注 0票数 2

我有一张按以下结构排列的桌子。

代码语言:javascript
复制
_________________________________
|| ExpObjkey   Exp1    Exp2  operator||
________________________________
    1            2        3    +
    2            4        5    +
    3            6        7    -

我想按以下顺序记录:

对于expObjKey=1,我们将

代码语言:javascript
复制
ExpObjKey Expression
   1       (4+5)+(6-7)      

说明:

代码语言:javascript
复制
for ExpObjKey 1 we will have 2 +3
then 2 will have 4+5
and 3 will have 6+7.

更像是等级制度。

我尝试了许多可能的方法,但没有接近解决方案。

代码语言:javascript
复制
 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-20 11:30:47

我不认为您可以使用分层查询来完成这一任务,但我有兴趣被证明是错误的。您需要从树的底部开始,然后按自己的方式工作,以允许替换发生;但是,似乎没有一种方法可以组合生成的部分表达式。递归子查询分解可能是可能的,但这在11 gR2之前是不可用的。

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

代码语言:javascript
复制
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, '*'的记录,这将提供:

代码语言:javascript
复制
EXPRESSION                   
------------------------------
((4+5)+(6-(8*9)))              

SQL Fiddle

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25329760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档