У меня есть таблица с отношениями родитель-ребенок.Отношения могут идти 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;
SQL Fiddle