从数据库表中查找包依赖项

时间:2010-07-02 18:27:17

标签: database sqlite recursion

我在数据库中有两个表,一个列出包,一个列出依赖项:

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上可用)。

1 个答案:

答案 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