2016-11-29 19 views
1

У меня есть две таблицы, как указано ниже:Oracle SQL Найти Circular Предпосылки

Course(Worker_id, Course_id) 
      Primary key is (Worker_id, Course_id) 

    Prerequisite(Course_id, Prerequisite_id) 
      Primary key is (Course_id, Prerequisite_id) 

Я хотел бы быть в состоянии найти все круговые предпосылки. Например, если CourseA является предварительным условием для CourseB, а CourseB является предварительным условием для CourseA (упрощенный пример). Мой результат должен быть названием курсов, у которых есть неудовлетворяемые предпосылки, в этом случае как CourseA, так и CourseB.

+0

Какую версию Oracle вы используете? –

+0

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – LEJ

+0

Для случаев, которые могут иметь более двух курсов в цикле, см. [Этот ответ] (http://stackoverflow.com/a/5803666/4479309) для решения. – Boneist

ответ

4
SELECT SYS_CONNECT_BY_PATH(Course_id, ' -> ') AS path 
FROM prerequisites 
WHERE CONNECT_BY_ISCYCLE = 1 
CONNECT BY NOCYCLE 
     PRIOR Course_id = Prerequisite_id; 
+0

, который не работает, если цикл содержит более двух элементов (например, курс A требует курса B, который требует курса C, который требует курса A). Вернее, это даст вам начало и конец цикла, но не любые значения между ними - то есть. курс B не будет сообщаться как находящийся в цикле. – Boneist

+0

, похоже, отлично работает для меня? включает в себя все курсы, которые являются частью цикла – LEJ

+0

@Boneist - sys_connect_by_path будет перечислять все узлы вдоль пути. – mathguy

 Смежные вопросы

  • Нет связанных вопросов^_^