oracle CONNECT_BY_ROOT在组内搜索

时间:2019-03-12 15:59:55

标签: sql oracle hierarchy connect-by

鉴于下表

   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'的行为问题。在下图中,我突出显示了错误的行。

Problem in the line

1 个答案:

答案 0 :(得分:0)

在您的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