(我正在使用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来检测它。
答案 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