Найти зависимости пакета из таблицы базы данных - PullRequest
1 голос
/ 02 июля 2010

У меня есть две таблицы в базе данных, один список списков и один список зависимостей:

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 s в цикле?

Я бы предпочел, чтобы он работал в SQLite, но я буду использовать другую базу данных, если потребуется (если она бесплатна и доступна в Linux).

1 Ответ

1 голос
/ 02 июля 2010

PostgreSQL - единственная СУБД с открытым исходным кодом, которая поддерживает рекурсивные запросы . Например, вы можете запустить это:

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. Смотрите мою презентацию Модели для иерархических данных с SQL и PHP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...