Используя SQL, есть ли способ сравнить, находится ли узел в родительской иерархии какого-либо из набора узлов? - PullRequest
1 голос
/ 30 марта 2019

Мне нужно выполнить поиск в моей иерархии, чтобы получить все узлы, которые выше или равны любому узлу, возвращенному в подзапросе.

заданная таблица: H

Child | Parent
  A1  | A
  A2  | A
  A1b | A1
  A2a | A2
  A2b | A2
  B1  | B
  B3  | B
  B1c | B1
  B3a | B3

Подзапросвозвращает:

A2a
A2b
B3

Мне нужен запрос, который использует результаты подзапроса для возврата.

A
A2
A2a
A2b
B
B3

Я пытался использовать запрос из thisТАК вопрос разобраться, но пока не повезло.

1 Ответ

1 голос
/ 30 марта 2019

Вы можете поместить существующий запрос в CTE, а затем настроить иерархический запрос, например:

WITH q(id) AS ( ... )
SELECT id FROM q
UNION ALL
SELECT DISTINCT Parent
FROM mytable
CONNECT BY PRIOR Parent = Child
START WITH Child in (SELECT id FROM q)
ORDER BY id

Демонстрация на DB Fiddle с вашим примеромданные:

WITH q(id) AS (
    SELECT 'A2a' FROM DUAL
    UNION ALL SELECT 'A2b' FROM DUAL
    UNION ALL SELECT 'B3' FROM DUAL
)
SELECT id FROM q
UNION ALL
SELECT DISTINCT Parent
FROM mytable
CONNECT BY PRIOR Parent = Child
START WITH Child in (SELECT id FROM q)
ORDER BY id
| ID  |
| :-- |
| A   |
| A2  |
| A2a |
| A2b |
| B   |
| B3  |
...