我目前正在尝试获取树的任何特定位置的所有关系和子项。 这些表如下:

TABLE ORGANISATION                      TABLE LINKS
| Orga_Name | Code  | DELETED |         | Code  | Dads_Code |  STT  |
| DR        | DR001 |  FALSE  |(root)   | DR001 |   Null    |   OK  |(root no dad snif)
| DSI       | DS001 |  FALSE  |         | DS001 |   DR001   |   OK  |
| DLE       | DL001 |  FALSE  |         | DL001 |   DR001   |   OK  |
| DMP       | DM001 |  FALSE  |         | DM001 |   DS001   |   OK  |
| TRS       | TR001 |  FALSE  |         | TR001 |   DM001   |   OK  |
| TRE       | TE001 |  TRUE   |         | TE001 |   DM001   |   NOK |
| TRC       | TC001 |  FALSE  |         | TE001 |   DM001   |   NOK |

如果任何行具有DELETED = TRUE或STT = NOK,则根本不应该考虑它。 (就像本示例中的TRE和TRC一样)

完美的结果如下所示:

|  Code  |   PICK-ONE|  Path                     |
|  DS001 |   DR001   |  DS001/DR001              |
|  DL001 |   DR001   |  DL001/DR001              |
|  DM001 |   DR001   |  DM001/DS001/DR001        |
|  TR001 |   DR001   |  TR001/DM001/DS001/DR001  |
|  DM001 |   DS001   |  DM001/DS001              |
|  TR001 |   DS001   |  TR001/DM001/DS001        |
|  TR001 |   DM001   |  DM001/TR001              |

因此,我可以在“ PICK-ONE”中选择一个代码,并将其所有(直接和间接)子代作为列表。 我一直在尝试使用CONNECT_BY_ROOT,这是我正在使用的当前代码:

    SELECT  Code, 
            CONNECT_BY_ROOT Code,
            LEVEL-1, 
            SYS_CONNECT_BY_PATH(Code, '/') "Path"--,STT

    FROM    (
            SELECT o1.*,a1.STT,o1.DELETED
            FROM ORGANISATION o1
            LEFT JOIN LINKS a1
            ON o1.Code=a1.Code
            AND DELETED = 'FALSE'
            )
    WHERE LEVEL > 0 AND STT like 'OK' 
    CONNECT BY PRIOR Code = Dads_Code;

我得到的结果大多来自他的根源,以及他的一个孩子(一直是相同的)。 在我的示例中,我得到的结果将来自DS001和DR001。 一些结果是正确的。 可悲的是,分析停止在2级最大值处 ,有一些重复项 ,也有一些通往自身结果的路径 (0级)。

我一直在尝试更改级别或路径,或更改某些条件,但找不到问题。 如果您能帮助我,我将非常高兴!

#1楼 票数:1 已采纳

不要使用CONNECT BY因为它在这一点上已经过时了。 在没有任何标准的日子,这是查询层次结构的好方法。

使用大多数数据库中可用的递归公用表表达式(aka递归CTE)作为SQL标准的一部分。

例如,如果要检索DR001所有子级,则可以执行以下操作:

with n (code, dads_code, lvl, path) as (
  select code, dads_code, 1, code from links where code = 'DR001'
  union all
  select l.code, l.dads_code, n.lvl + 1, n.path || '/' || l.code
    from links l
    join n on n.code = l.dads_code
    where l.stt <> 'NOK'
      and not exists (select 1 from organisation o 
                      where o.code = l.code and deleted = 'TRUE')
)
select code, dads_code, lvl, path from n

  ask by ThZ translate from so

未解决问题?本站智能推荐:

1回复

具有所有组合的Oracle返回树

我需要一个查询,该查询将返回组中的所有女性。 数据表示例(Oracle 11g): 我需要生成一个包含所有组合的树,而不必在组(组K,L,P)中重复 一棵树不能包含一组树,即一定不能有这样一个分支的树:K1-> L1-> K2
2回复

使用connect_by获取OracleDB表中树中节点的深度

我有一个oracle表,看起来像这样: 架构: (编号)node_id (编号)parent_id (编号)parent_seq 表中的每个条目表示单个父/子关系。 父对象可以是多个子对象的父对象,子对象可以有多个父对象(但我们可以假设没有循环存在,因为它在提交之前已经过验
3回复

在树中搜索的SQL查询

我有一棵简单的树,其中包含4个级别的深度数据。 这是表DDL 层次结构从WITH ID = PARENT_ID开始。 级别数是固定的。 它始终为4。我们在第4层都有分支的叶子。 因此,如有必要,我们还可以添加3列代表祖先的LABEL。 我需要建立一个查询 在任何层次结构的L
1回复

Oracle复制表中的树

我正在寻找一些有趣的简单算法来将树的一部分复制(克隆)到树的另一部分。 我们有一张桌子: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=9fe802f144a3af0663754cfb3e8dc1ba 如何轻松复制“CA”(ID = 6)下的所有
1回复

从数据库加载树

我有一些类别,但其中一些具有子类别。 所以我有一棵树。 我创建了一个名为Categories的表。 id字段是主键,另一个字段是PARENTID ,这是id引用的外键(使其成为分层结构)。 你可以在这里查看数据 我将指定一个特定的ID ,查询将为我提供该类别和所有子类别的ID 。
3回复

在oracle树查询中加入其他表

给出一个简单的(id,description)表t1,例如 和父子关系表t2,如 Oracle提供了一种将此方法作为具有一些自定义语法扩展的树遍历的方法: 确切的语法并不重要,我可能在上面做了一个错误。 重要的是上面会产生一些看起来像的东西 我的问题是:是否可以在sys_con
1回复

甲骨文树:遗漏的前身和追随者

我想获得递归查询的帮助。 对我来说,“按优先顺序连接”是新手,我在使用它时遇到了一些困难。 我正在寻找一种方法来获取按连通性(父子关系)分类的数据列表,同时省略Oracle 11gR2中的某些类型的记录。 换句话说,我有一个像树的结构,我想要一棵新的树,其中一些无效数据将被忽略。 例
3回复

使用oracleconnectby查找邻接列表模型中的所有节点

鉴于以下模型: 鉴于以下数据: 得到以下树: 现在我可以找到5的父母: 但是如何从5开始获取所有节点(1,2,3,4,5,6)?