oracle CONNECT_BY_ROOT поиск в группе - PullRequest
0 голосов
/ 12 марта 2019

приведена следующая таблица

   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 как столбец отца. Моя цель - показать всех отцов (прямых и косвенных в иерархии) KID в GROUP_KEY.

Этот запрос не выполняется внутри GROUP_KEY изолированным способом. Вы можете наблюдать проблему в поведении KID 'POD005'. На следующем изображении я выделил неправильную линию.

Problem in the line

1 Ответ

0 голосов
/ 13 марта 2019

Добавьте условие к вашему предложению 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
...