2016-11-29 53 views
1

我有兩個表定義如下:的Oracle SQL查詢通知先決條件

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數據庫11g企業版版本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