【问题标题】:Oracle sql query to get parent node based on type?Oracle sql查询根据类型获取父节点?
【发布时间】:2018-07-24 02:32:48
【问题描述】:

我在构建分层查询以根据类型获取父节点时需要帮助。例如:

Table (org)

pid|cid|type|name
   |  1|MGT |Ofc Pres
  1|  2|DEP |HR
  1|  3|DEP |IT
  3|  4|DIV |Web
  3|  5|DIV |Database
  4|  6|SEC |HTML
  4|  7|SEC |JAVA

我的目标是在给定 cid(6 或 7)的情况下获得 DEP。使用下面的查询,我只得到 pid (4)。

  select pid
    from org
   start
    with cid = 7
 connect
      by
   prior cid = pid

感谢任何反馈。

2018 年 7 月 24 日更新:

一些可能有帮助的附加信息。

MGT(管理)是最高/根级别 DEP(部门)隶属于 MGT。 DIV(部门)在 DEP 下。 SEC(部分)在 DIV 下。

因此,如果给定一个 SEC 类型的子 ID,我需要获取它所在的 DEP(部门)(这意味着我需要先获取 DIV,然后再获取 DEP)。如果给定一个 DIV 类型的子 ID,那么我需要获取它所在的 DEP。

【问题讨论】:

  • 我不明白。 “获取 DEP”是什么意思?你的意思是,当type = 'DEP' 时停止?然后你需要得到DEPname 吗?如果在上树时,您从未点击过DEP 怎么办? (或者你保证你永远都会这样做?嗯,显然这是不可能的;如果你“从 1 开始”,你永远不会点击DEP。)
  • @mathguy 是的。我需要获取类型为“DEP”的父级的名称/ID。是的,它保证 DEP 将永远存在。不一定是下一个级别,但它会在那里。 Start 将始终低于 DEP。

标签: oracle hierarchy connect-by


【解决方案1】:

你需要从叶子到根构建你的树。

所以改变pid和cid:

 select pid
    from org
   start
    with cid = 7
 connect by prior pid = cid

【讨论】:

  • 谢谢。为了获得 DEP,我在 where 子句中添加了“type='DEP'”。这似乎有效,但我想与您确认这是否正确。
【解决方案2】:

已经指出了一个问题:connect by prior pid = cid。要在类型为DEP 时停止,需要在connect by 中再添加一个条件:

connect by prior pid = cid and prior type != 'DEP'

并添加一个`WHERE子句:

where type = 'DEP'

(注意WHERE 子句位于START WITHCONNECT BY 之前)。

不清楚你想SELECT,但这应该很容易。

实际上,使用您拥有的简单结构,WHERE 子句就足够了。在CONNECT BY 中没有附加条件意味着查询只会做一些不必要的工作;它也会找到 MGT 行,但仍会选择 type = 'DEP' 所在的唯一行。

【讨论】:

    【解决方案3】:

    基于Oracle documentPRIOR 运算符引用父行。

    所以你的查询应该是

      select pid
        from org
       where level = 2 --to get DEP
     connect by prior pid = cid;
    

    【讨论】:

      猜你喜欢
      • 2015-05-08
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      相关资源
      最近更新 更多