代码之家  ›  专栏  ›  技术社区  ›  Brendan Long

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

  •  1
  • Brendan Long  · 技术社区  · 14 年前

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

    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 回复  |  直到 14 年前
        1
  •  1
  •   Bill Karwin    14 年前

    PostgreSQL是唯一支持 recursive queries . 例如,可以运行以下命令:

    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);
    

    Models for Hierarchical Data with SQL and PHP .