【问题标题】:oracle CONNECT_BY_ROOT searching within a grouporacle CONNECT_BY_ROOT 在组内搜索
【发布时间】:2019-08-03 04:24:39
【问题描述】:

如下表

   KID   | CROSS_LINK |  KEY   | GROUP_KEY 
 --------|------------|--------|----------- 
  COR001 |            | 711768 |    336406 
  EXP001 |            | 740194 |    336406 
  POD002 | DPR002     | 712408 |    336406 
  POD003 | POD002     | 718445 |    336406 
  DPR001 |            | 711825 |    336406 
  TRC001 |            | 713773 |    336406 
  DPR002 |            | 712199 |    336406 
  POD001 | DPR001     | 712191 |    336406 
  POD004 | POD001     | 815174 |    336406 
  POD005 | POD003     | 815181 |    336406 
  POD002 | DPR001     | 478800 |    475873 
  POD005 | POD002     | 300266 |    475873 
  DPR001 |            | 300202 |    475873 

我的sql语句是

select level lvl, kid,  CONNECT_BY_ROOT CROSS_LINK  as father, key, group_key 
 from  t
start with CROSS_LINK is not null
CONNECT BY PRIOR  kid =  CROSS_LINK
order by  GROUP_KEY

您可以将 CROSS_LINK 视为父列。 我的目标是在 GROUP_KEY 中显示 KID 的所有父亲(层次结构中的直接和间接)。

此查询不会以孤立的方式在 GROUP_KEY 内运行。您可以在 KID 'POD005' 的行为中观察到问题。在下图中,我突出显示了错误的行。

【问题讨论】:

  • 为什么不CONNECT BY PRIOR kid = CROSS_LINK AND PRIOR group_key = group_key
  • 这似乎有效。我会再次检查它,并在这里提供我的反馈。谢谢
  • 好的...我想也许我误解了这个问题。我会添加它作为答案。

标签: sql oracle hierarchy connect-by


【解决方案1】:

CONNECT BY 子句中添加一个条件,强制它只在与父行相同的GROUP_KEY 中查找子行。

select level lvl, kid,  CONNECT_BY_ROOT CROSS_LINK  as father, key, group_key 
from  t
start with CROSS_LINK is not null
CONNECT BY PRIOR  kid =  CROSS_LINK
AND PRIOR group_key = group_key
order by  GROUP_KEY

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2012-02-22
    • 2020-11-07
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多