Получить список зависимых объектов с помощью SQL-запроса или функции - PullRequest
1 голос
/ 06 апреля 2019

У меня есть две таблицы.Один для задачи, а второй - таблица зависимостей для задач.Я хочу, чтобы запрос дал мне все задачи (рекурсивно) на основе определенного идентификатора.

У меня есть две таблицы.Один для задачи

ID  TASK  
1   Abc  
2   Def  
3   Ghi  
4   Jkl  
5   Mno  
6   Pqr 

Второй для получения зависимых задач

ID  DEPENDENT_ON  
2   1  
3   1  
4   2  
4   6  
5   2  
6   5  

Можно ли написать SQL-запрос, чтобы получить список всех задач (рекурсивных), которыезависят от конкретной задачи.

Пример.
Я хочу проверить все задачи, зависящие от ID = 1.Ожидаемый результат (который равен 2 и 3):

2.Def
3.Ghi 

Более того, запрос также должен выдавать выходные данные этих двух зависимых задач и так далее.Окончательный вывод должен быть:

2.Def -- level one
3.Ghi -- level one 
4.Jkl -- Dependent on task 2  
5.Mno -- Dependent on task 2 
6.Pqr -- Dependent on task 5

Форматирование не имеет значения.Требуется только вывод

1 Ответ

0 голосов
/ 06 апреля 2019

Мне нужно объединить две таблицы и затем выполнить рекурсивный поиск.

Вы должны ВНЕШНЕЕ СОЕДИНИТЬ со второй таблицей (которую вы не назвали, поэтому я назвал ее TASK_TREE)через DEPENDENT_ON до родительского идентификатора.Внешнее соединение, потому что задача 1 является вершиной дерева и не зависит от задачи.Затем используйте иерархический синтаксис запросов Oracle для обхода дерева:

select t.id, t.task, tt.dependent_on, level
from tasks t
     left outer join task_tree tt on tt.id = t.id
connect by prior t.id = tt.dependent_on 
start with t.id = 1
/

Я включил level, чтобы вы могли видеть, как дерево разворачивается.Документация по Oracle SQL подробно описывает иерархические запросы. Узнайте больше .Если вы не хотите использовать собственный иерархический синтаксис Oracle, с 11gR2 Oracle поддерживает рекурсивное предложение WITH. Узнать больше .

Кстати, ваши опубликованные данные содержат ошибку.Задача 4 зависит от 2 и 6. Иерархии должны иметь дочерние узлы, которые зависят от одного родительского узла.В противном случае вы получите всевозможные странные результаты.

...