Пусть древовидная структура реализуется в SQL, как это:SQL выберите потомков строки
CREATE TABLE nodes (
id INTEGER PRIMARY KEY,
parent INTEGER -- references nodes(id)
);
Хотя циклы могут быть созданы в этом представлении, давайте предположим, что мы никогда не позволить этому случиться. В таблице будет храниться только коллекция корней (записи, где parent имеет значение null) и их потомки.
Цель состоит в том, чтобы, учитывая идентификатор узла на столе, найти все узлы, являющиеся потомками.
является потомком B если либо 'родитель ы является В или ' родитель ы является потомком B. Обратите внимание на рекурсивное определение.
Вот некоторые примерные данные:
INSERT INTO nodes VALUES (1, NULL);
INSERT INTO nodes VALUES (2, 1);
INSERT INTO nodes VALUES (3, 2);
INSERT INTO nodes VALUES (4, 3);
INSERT INTO nodes VALUES (5, 3);
INSERT INTO nodes VALUES (6, 2);
, который представляет собой:
1
`-- 2
|-- 3
| |-- 4
| `-- 5
|
`-- 6
Мы можем выбрать (немедленные) детей 1
, делая это:
SELECT a.* FROM nodes AS a WHERE parent=1;
Мы можем выберите детей и внуков 1
, выполнив следующие действия:
SELECT a.* FROM nodes AS a WHERE parent=1
UNION ALL
SELECT b.* FROM nodes AS a, nodes AS b WHERE a.parent=1 AND b.parent=a.id;
Мы можем выбрать детей, внуков и правнуков 1
, делая это:
SELECT a.* FROM nodes AS a WHERE parent=1
UNION ALL
SELECT b.* FROM nodes AS a, nodes AS b WHERE a.parent=1 AND b.parent=a.id
UNION ALL
SELECT c.* FROM nodes AS a, nodes AS b, nodes AS c WHERE a.parent=1 AND b.parent=a.id AND c.parent=b.id;
Как запрос может быть построен, который получает все потомки узла 1
, а не тех, кто на фиксированный глубина? Похоже, мне нужно будет создать рекурсивный запрос или что-то еще.
Я хотел бы знать, возможен ли такой запрос с использованием SQLite. Однако, если для этого типа запросов требуются функции, недоступные в SQLite, мне любопытно узнать, можно ли это сделать в других базах данных SQL.
Определенно дурацкая, определенно удивительная! Кроме того, как насчет разметки идентификаторов с помощью косой черты? (например, «1/2/3/4») –
Мне это нравится, это намного проще, чем мое предложение, хотя, возможно, и не столь универсальное. Я думаю, это зависит от ваших реальных потребностей, хотя ... –
его в основном URL-адрес :) вы могли бы просто использовать URL-адрес, если хотите, и использовать ту же технику. также может помещать маркер в листовые узлы, если вам захочется запросить их. –