【发布时间】:2019-09-07 21:49:47
【问题描述】:
我有一张带有父子关系的表。关系可以深入到 n 级。 还有一个表格,其中包含属于某个组的元素。
CREATE TABLE group_children(
id serial PRIMARY KEY,
parent_id integer,
children_id integer,
contains boolean
);
CREATE TABLE group_item(
id serial PRIMARY KEY,
group_id integer,
name text
);
INSERT INTO group_children(parent_id, children_id, contains) VALUES
(1, 2, true),
(1, 3, false),
(2, 4, true),
(2, 5, false),
(3, 6, true),
(3, 7, false);
INSERT INTO group_item(group_id, name) VALUES
(4, 'aaa'),
(4, 'bbb'),
(5, 'bbb'),
(5, 'ccc'),
(6, 'aaa'),
(6, 'bbb'),
(7, 'aaa'),
(7, 'ccc');
因此,我们可以将此数据表示为 不一定是二叉树的形式,只是一个简单的例子。组可以包含 m 个孩子。
需要从右到左阅读。第 4 组包含 ['aaa', 'bbb'],第 5 组 - ['bbb', 'ccc']。第 2 组包括第 4 组中的所有项目,但不包括第 5 组中的所有项目。因此第 2 组包含 ['aaa']。等等。毕竟计算组 1 将包含 ['aaa']。
问题是:如何构建一个sql查询来获取属于组1的所有项目?
我能做的:
WITH RECURSIVE r AS (
SELECT group_children.parent_id, group_children.children_id, group_children.contains, group_item.name
FROM group_children
LEFT JOIN group_item ON group_children.children_id = group_item.group_id
WHERE parent_id = 1
UNION ALL
SELECT group_children.parent_id, group_children.children_id, group_children.contains, group_item.name
FROM group_children
LEFT JOIN group_item ON group_children.children_id = group_item.group_id
JOIN r ON group_children.parent_id = r.children_id
)
SELECT * FROM r;
【问题讨论】:
标签: postgresql recursion recursive-query