SQL - 列出所有先决条件(如循环)

时间:2014-11-18 21:57:26

标签: sql oracle sqlplus

(我正在使用SQL Plus,虽然我认为这不会太重要)

好的,我的数据库结构与此类似:

CREATE TABLE MODULE (
  module_code       INT,
  PRIMARY KEY (module_code)
);

CREATE TABLE PREREQUISITES (
  module_code       INT,
  prerequisite_code VARCHAR(6),
  FOREIGN KEY (module_code) REFERENCES MODULE(module_code),
  FOREIGN KEY (prerequisite_code) REFERENCES MODULE(module_code)
);

所以数据可能如下所示:

MODULE:
5
15
20
100

PREREQUISITES:
100  20
100  15
15   5

我的问题是,有没有办法列出模块的所有先决条件(例如100的先决条件是:20,15和5(因为15的先决条件是5)或必须以编程方式完成。

我也知道可能有循环引用。我再次想到了一种以编程方式执行此操作的方法,但是有一种方法可以使用SQL来检测它。

1 个答案:

答案 0 :(得分:2)

实际上,您正在使用的RDBMS完全符合您要完成的任务。您将分层数据存储在adjacency list模型中。由于您使用oracle,因此可以使用CONNECT BY遍历树:

SELECT * 
FROM PREREQUISITES
START WITH module_code = 100
CONNECT BY module_code = PRIOR prerequisite_code

这是一篇关于这个主题的好文章:http://explainextended.com/2009/09/28/adjacency-list-vs-nested-sets-oracle/


如果重复和无限循环是潜在问题,您可以使用nocylcle来阻止无限循环和子查询返回distinct结果:

SELECT * 
FROM (SELECT DISTINCT module_code, prerequisite_code FROM PREREQUISITES) T
START WITH module_code = 100
CONNECT BY NOCYCLE module_code = PRIOR prerequisite_code