【问题标题】:Oracle CONNECT_BY query.Oracle CONNECT_BY 查询。
【发布时间】:2014-05-30 07:31:12
【问题描述】:
SELECT LPAD('*', 2*level-1)||SYS_CONNECT_BY_PATH(unit_data, '/') "battle_unit_id"
   FROM battle_units
   START WITH battle_unit_id= 600
   CONNECT BY PRIOR parent_id = battle_unit_id;

返回

/Doctrine
  /Doctrine/Air
    /Doctrine/Air/Jet powered aircraft
       /Doctrine/Air/Jet powered aircraft/F-16

我想要的只是/Doctrine/Air/Jet powered aircraft/F-16 没有其他三个结果。有办法吗?

编辑:

我的预言机版本:

Oracle 数据库 11g 企业版 11.2.0.3.0 版 - 生产
PL/SQL 版本 11.2.0.3.0 - 生产
核心 11.2.0.3.0 生产
适用于 Linux 的 TNS:版本 11.2.0.3.0 - 生产
NLSRTL 版本 11.2.0.3.0 - 生产

【问题讨论】:

  • 这是什么版本的oracle?
  • 11g 上面给出了更多细节

标签: sql oracle hierarchical-query


【解决方案1】:

如果我理解正确,您只需要树叶:

SELECT LPAD('*', 2*level-1)||SYS_CONNECT_BY_PATH(unit_data, '/') "battle_unit_id"
FROM battle_units 
WHERE connect_by_isleaf = 1  -- <<< this selects only the leaf nodes
START WITH battle_unit_id= 600
CONNECT BY PRIOR battle_unit_id = parent_id;

详见说明书:http://docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns001.htm#SQLRF00251

【讨论】:

  • 如果我用CONNECT BY PRIOR parent_id = gdi_schema_id; 替换CONNECT BY PRIOR gdi_schema_id = parent_id,新的替换会给出输出F-16/Jet powered aircraft/Air/Doctrine...这几乎是我想要的
【解决方案2】:

如果您知道该行将出现的确切级别,这是可行的。

请参阅this fiddle

编辑: 既然你要争取最大,this may work 给你。

【讨论】:

  • 假设我想要最高级别,但我不知道有多少级别。我该怎么做?
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多