Получи родительский свой silbilng в sql oracle - PullRequest
0 голосов
/ 27 сентября 2019

Учитывая родительско-дочерние отношения.Я хочу получить все родители и данные данного childId

parentId |  chilId 

--------------------
null     |   Node0

Node0    |   Node1

Node0    |   Node2

Node1    |   Node3

Node1    |   Node4

Node2    |   Node5

Node3    |   Node6

Node3    |   Node7

null     |    C0

C0       |    C1

C0       |    C3

C3       |    C1

---------------------

Предположим, если выбрать childID в качестве Node6, я получу следующие результаты:

null     |   Node0

Node0    |   Node1

Node0    |   Node2

Node1    |   Node3

Node1    |   Node4

Node2    |   Node5

Node3    |   Node6

Node3    |   Node7

1 Ответ

1 голос
/ 27 сентября 2019

Я думаю, что вы можете достичь этого, используя connect by prior и некоторые функции следующим образом:

Передача Node6 в качестве входного параметра, используется в предложении WHERE в двух местах

SQL> WITH DATA (PARENT, CHILD) AS
  2  (SELECT null , 'Node0'   FROM DUAL UNION ALL
  3  SELECT 'Node0', 'Node1' FROM DUAL UNION ALL
  4  SELECT 'Node0', 'Node2' FROM DUAL UNION ALL
  5  SELECT 'Node1', 'Node3' FROM DUAL UNION ALL
  6  SELECT 'Node1', 'Node4' FROM DUAL UNION ALL
  7  SELECT 'Node2', 'Node5' FROM DUAL UNION ALL
  8  SELECT 'Node3', 'Node6' FROM DUAL UNION ALL
  9  SELECT 'Node3', 'Node7' FROM DUAL UNION ALL
 10  SELECT null , 'C0' FROM DUAL UNION ALL
 11  SELECT 'C0', 'C1'  FROM DUAL UNION ALL
 12  SELECT 'C0', 'C3'  FROM DUAL UNION ALL
 13  SELECT 'C3', 'C1'  FROM DUAL),
 14  DATA_ACTUAL AS
 15  (SELECT PARENT,
 16          CHILD,
 17          CONNECT_BY_ROOT CHILD ROOT_,
 18          SYS_CONNECT_BY_PATH(PARENT, '/') CP FROM DATA
 19   CONNECT BY PRIOR CHILD = PARENT START WITH PARENT IS NULL)
 20  --
 21  SELECT PARENT,
 22         CHILD
 23    FROM DATA_ACTUAL
 24   WHERE ROOT_ = (SELECT ROOT_ FROM DATA_ACTUAL WHERE CHILD = 'Node6')
 25  AND CP NOT LIKE (SELECT '%' || PARENT || '/%' FROM DATA_ACTUAL WHERE CHILD = 'Node6');

PAREN CHILD
----- -----
      Node0
Node0 Node1
Node1 Node3
Node3 Node6
Node3 Node7
Node1 Node4
Node0 Node2
Node2 Node5

8 rows selected.

SQL>

Передав входной параметр как Node2:

SQL> WITH DATA (PARENT, CHILD) AS
  2  (SELECT null , 'Node0'   FROM DUAL UNION ALL
  3  SELECT 'Node0', 'Node1' FROM DUAL UNION ALL
  4  SELECT 'Node0', 'Node2' FROM DUAL UNION ALL
  5  SELECT 'Node1', 'Node3' FROM DUAL UNION ALL
  6  SELECT 'Node1', 'Node4' FROM DUAL UNION ALL
  7  SELECT 'Node2', 'Node5' FROM DUAL UNION ALL
  8  SELECT 'Node3', 'Node6' FROM DUAL UNION ALL
  9  SELECT 'Node3', 'Node7' FROM DUAL UNION ALL
 10  SELECT null , 'C0' FROM DUAL UNION ALL
 11  SELECT 'C0', 'C1'  FROM DUAL UNION ALL
 12  SELECT 'C0', 'C3'  FROM DUAL UNION ALL
 13  SELECT 'C3', 'C1'  FROM DUAL),
 14  DATA_ACTUAL AS
 15  (SELECT PARENT,
 16          CHILD,
 17          CONNECT_BY_ROOT CHILD ROOT_,
 18          SYS_CONNECT_BY_PATH(PARENT, '/') CP FROM DATA
 19   CONNECT BY PRIOR CHILD = PARENT START WITH PARENT IS NULL)
 20  --
 21  SELECT PARENT,
 22         CHILD
 23    FROM DATA_ACTUAL
 24   WHERE ROOT_ = (SELECT ROOT_ FROM DATA_ACTUAL WHERE CHILD = 'Node2')
 25  AND CP NOT LIKE (SELECT '%' || PARENT || '/%' FROM DATA_ACTUAL WHERE CHILD = 'Node2');

PAREN CHILD
----- -----
      Node0
Node0 Node1
Node0 Node2

SQL>

Приветствия !!

...