我在数据库中有两个表,一个列出包,一个列出依赖项:
packages
id | name
---------
0 | xorg
1 | gnome-session
2 | gnome-panel
3 | gnome-mixer-applet
4 | gnome-media
depends
package | depends
-----------------
1 | 0
2 | 1
3 | 2
4 | 2
显然,如果我想找出一个包依赖的东西,我可以这样做:
SELECT *
FROM packages
INNER JOIN depends
ON packages.id = depends.package
WHERE packages.id = @somenumber
问题是这只给了我一级依赖(4依赖于2,但它也取决于包1和0)。有没有办法获得所有的依赖关系,而不只是在循环中运行类似的SELECT
?
我更喜欢它在SQLite中运行,但如果需要,我将使用不同的数据库(只要它是免费的并且在Linux上可用)。
答案 0 :(得分:1)
PostgreSQL是唯一支持recursive queries的开源RDBMS。例如,你可以运行:
WITH RECURSIVE package_deps(id) AS (
SELECT d.package FROM depends d WHERE d.package = @startingnumber
UNION ALL
SELECT d.package FROM depends d JOIN package_deps pd ON d.depends = pd.id
)
SELECT p.* FROM package_deps pd JOIN packages p USING (id);
SQLite不支持递归查询,但是还有其他几种解决方案可以在更简单的SQL中管理分层数据。请参阅我的演示文稿Models for Hierarchical Data with SQL and PHP。