使用带有自外键的递归
Using recursion with a self Foreign key
我使用的是 PostgreSQL 10,我有以下结构:
A table 带有自身外键的类型。
id name parent_id
1 namea Null
2 nameb Null
3 namea1 1
4 namea11 3
5 namea111 4
6 nameb1 2
7 nameb2 2
A table Item_Type
多对多关系
id type_id item_id
1 1 1
2 3 2
3 5 3
4 7 4
Table 与类型有 M2M 关系的项目。
id name
1 item1
2 item2
3 item3
4 item4
目前,我正在使用一个额外的 path
字段,我每次使用 Type 进行操作(crud)时都会计算它。
我想知道是否可以更快更容易地尝试使用 PostgreSQL recursion
。
我看了文档,但不是很明白,因为我报错了,我也没有低估原因。
WITH RECURSIVE descendants AS (
SELECT id, name FROM Type WHERE id = 1
UNION
SELECT t.id, t.name, t.parent_id FROM Type AS t
INNER JOIN descendants AS d ON d.id = t.parent_id
) SELECT * FROM descendants;
ERROR: each UNION query must have the same number of columns
我需要什么 - 提供类型名称:
1) 获取请求的 Type
的所有 names/id 并且是后代
2) 获取请求的Type
和后代的所有Item
,以及每个Type
和后代
的Item
个数
例如:
如果请求的类型名称是 'namea1',我应该获取类型 ID 1,3,4,5
和
对于项目 ID 1,2,3
错误说明了一切。您的工会分为:
SELECT <2 fields> from Type ...
SELECT <3 fields> from Type JOIN Descendant ...
只需 select 两半 3 个字段:
WITH RECURSIVE descendants AS (
SELECT id, name, parent_id FROM Type WHERE id = 1
UNION
SELECT t.id, t.name, t.parent_id FROM Type AS t
INNER JOIN descendants AS d ON d.id = t.parent_id
) SELECT * FROM descendants;
我使用的是 PostgreSQL 10,我有以下结构:
A table 带有自身外键的类型。
id name parent_id
1 namea Null
2 nameb Null
3 namea1 1
4 namea11 3
5 namea111 4
6 nameb1 2
7 nameb2 2
A table Item_Type
多对多关系
id type_id item_id
1 1 1
2 3 2
3 5 3
4 7 4
Table 与类型有 M2M 关系的项目。
id name
1 item1
2 item2
3 item3
4 item4
目前,我正在使用一个额外的 path
字段,我每次使用 Type 进行操作(crud)时都会计算它。
我想知道是否可以更快更容易地尝试使用 PostgreSQL recursion
。
我看了文档,但不是很明白,因为我报错了,我也没有低估原因。
WITH RECURSIVE descendants AS (
SELECT id, name FROM Type WHERE id = 1
UNION
SELECT t.id, t.name, t.parent_id FROM Type AS t
INNER JOIN descendants AS d ON d.id = t.parent_id
) SELECT * FROM descendants;
ERROR: each UNION query must have the same number of columns
我需要什么 - 提供类型名称:
1) 获取请求的 Type
的所有 names/id 并且是后代
2) 获取请求的Type
和后代的所有Item
,以及每个Type
和后代
Item
个数
例如:
如果请求的类型名称是 'namea1',我应该获取类型 ID 1,3,4,5
和
对于项目 ID 1,2,3
错误说明了一切。您的工会分为:
SELECT <2 fields> from Type ...
SELECT <3 fields> from Type JOIN Descendant ...
只需 select 两半 3 个字段:
WITH RECURSIVE descendants AS (
SELECT id, name, parent_id FROM Type WHERE id = 1
UNION
SELECT t.id, t.name, t.parent_id FROM Type AS t
INNER JOIN descendants AS d ON d.id = t.parent_id
) SELECT * FROM descendants;