SQL-запрос для получения всех предков узла в одну строку - PullRequest
0 голосов
/ 29 октября 2018

У меня есть таблица со следующей структурой

  • Child_id
  • Parent_Id
  • Child_name
  • Parent_name
  • Child_Description

Я хочу запрос, чтобы собрать всех родителей всех узлов уровня листьев в одну строку.

Например: если X и Y являются узлами конечного уровня в следующем:

A->B->C->D->X

F->G->H->I->Y

Запрос должен вернуть 2 строки следующим образом

Child Parent1 Parent2 Parent3 Parent4
X  D  C  B  A
Y  I  H  G  F

Спасибо, Dev

1 Ответ

0 голосов
/ 29 октября 2018

Имеет ли это какой-то смысл?

SQL> with test (child_id, parent_id) as
  2    (select 'x', 'd'  from dual union all
  3     select 'd', 'c'  from dual union all
  4     select 'c', 'b'  from dual union all
  5     select 'b', 'a'  from dual union all
  6     select 'a', null from dual union all
  7     --
  8     select 'y', 'i'  from dual union all
  9     select 'i', 'h'  from dual union all
 10     select 'h', 'g'  from dual union all
 11     select 'g', 'f'  from dual union all
 12     select 'f', null from dual
 13    ),
 14  anc as
 15    (select sys_connect_by_path(child_Id, '>') pth
 16     from test
 17     where connect_by_isleaf = 1
 18     connect by prior child_id = parent_id
 19     start with parent_id is null
 20    )
 21  select regexp_substr(pth, '[^>]+', 1, 5) c1,
 22         regexp_substr(pth, '[^>]+', 1, 4) c2,
 23         regexp_substr(pth, '[^>]+', 1, 3) c3,
 24         regexp_substr(pth, '[^>]+', 1, 2) c4,
 25         regexp_substr(pth, '[^>]+', 1, 1) c5
 26  from anc;

C1 C2 C3 C4 C5
-- -- -- -- --
x  d  c  b  a
y  i  h  g  f

SQL>

Что это делает?

  • test CTE моделирует ваши данные (по крайней мере, я так думаю)
  • anc (estors) CTE выбирает «самый длинный» путь, потому что CONNECT_BY_ISLEAF показывает, может ли текущая строка быть (или не может) расширяться дальше. Если он возвращает 1, он не может.
  • запрос final использует регулярные выражения для преобразования строки CSV (в моем примере это разделитель >; может быть что-то еще) в столбцы. В этом нет ничего динамического, поэтому - если ваши данные отличаются от 5 «столбцов», вам придется это исправить
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...