假设在 SQL 中实现了一个树结构,如下所示:
CREATE TABLE nodes (
id INTEGER PRIMARY KEY,
parent INTEGER -- references nodes(id)
);
尽管可以在这种表示中创建循环,但我们假设我们永远不会让这种情况发生。该表将仅存储根(父为空的记录)及其后代的集合。
目标是,给定表上一个节点的 id,找到它的所有后代节点。
如果A的父级是B或A的父级是B的后代,则A是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 数据库中完成。