kni*_*irr 7 postgresql recursive-query hierarchical-data
我在制定递归查询的 PostgreSQL 文档时遇到了一些麻烦,想知道是否有人能够为以下内容提供建议。
这是数据:
Table "public.subjects"
Column | Type | Collation | Nullable | Default
-------------------+-----------------------------+-----------+----------+--------------------------------------
id | bigint | | not null | nextval('subjects_id_seq'::regclass)
name | character varying | | |
Table "public.subject_associations"
Column | Type | Collation | Nullable | Default
------------+-----------------------------+-----------+----------+--------------------------------------------------
id | bigint | | not null | nextval('subject_associations_id_seq'::regclass)
parent_id | integer | | |
child_id | integer | | |
Run Code Online (Sandbox Code Playgroud)
在这里,一个“主体”可能有许多父母和许多孩子。当然,在顶层一个科目没有父母,在底层没有孩子。例如:
parent_id | child_id
------------+------------
2 | 3
1 | 4
1 | 3
4 | 8
4 | 5
5 | 6
6 | 7
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是从 child_id 开始获取所有祖先,并从 parent_id 开始获取所有后代。所以:
parent_id 1 -> children 3, 4, 5, 6, 7, 8
parent_id 2 -> children 3
child_id 3 -> parents 1, 2
child_id 4 -> parents 1
child_id 7 -> parents 6, 5, 4, 1
Run Code Online (Sandbox Code Playgroud)
虽然似乎有很多关于我无法理解它们的类似事情的例子,但我欢迎任何我可以尝试的建议。
Lau*_*lbe 18
要获取主题 1 的所有孩子,您可以使用
WITH RECURSIVE c AS (
SELECT 1 AS id
UNION ALL
SELECT sa.child_id
FROM subject_associations AS sa
JOIN c ON c.id = sa. parent_id
)
SELECT id FROM c;
Run Code Online (Sandbox Code Playgroud)
CREATE OR REPLACE FUNCTION func_finddescendants(start_id integer)
RETURNS SETOF subject_associations
AS $$
DECLARE
BEGIN
RETURN QUERY
WITH RECURSIVE t
AS
(
SELECT *
FROM subject_associations sa
WHERE sa.id = start_id
UNION ALL
SELECT next.*
FROM t prev
JOIN subject_associations next ON (next.parentid = prev.id)
)
SELECT * FROM t;
END;
$$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)