【发布时间】:2017-06-02 06:40:21
【问题描述】:
我遇到了递归请求的问题。在我解释之前:我使用的是 PostgreSQL 8.4。
总结起来,我有 2 个表:t_object 和 t_package t_object 有 3 列:id、name 和 package_id t_package 有 3 列:id、name 和 parent_id (这是一个非常示意性的表示。这实际上是 Enterprise Architect 的项目数据库)
t_package.parent_id 是包的父包,你猜对了。 当递归跟踪面包屑时,可以获得一个对象顶部包。例如:
TOPPACKAGE
|
+--PACKAGE
|
+--ANOTHERPACKAGE
|
+--ANOBJECT
+--ANOTHEROBJECT
问题是:可以有不止一个顶级包... 我的目标是创建一个基于 t_object 的视图,其中包含一个包含每个对象的顶级包的额外列。
我成功发起了获取对象顶层包的递归请求:
WITH RECURSIVE parents(package_id, name, parent_id) AS (
SELECT t_package.package_id, t_package.name, t_package.parent_id
FROM t_package
WHERE t_package.package_id = (
SELECT package_id
FROM t_object
WHERE name = 'The name of an object'
)
UNION
SELECT t_package.package_id, t_package.name, t_package.parent_id
FROM t_package, parents
WHERE parents.parent_id = t_package.package_id
) SELECT * FROM parents WHERE parent_id = 0
然后,我尝试创建 t_object 加上额外列的视图...到目前为止没有成功!
我不得不承认,我在这里显然触及了 SQL 的极限,我不知道如何实现这一点:(
示例数据:
t_object:
id;name;package_id
1;'First object';11
2;'Second object';11
3;'Third object';14
4;'Fourth object';12
t_package:
id;name;parent_id
10;'First package';13
11;'Second package';10
12;'Third package';14
13;'First root package';0
14;'Second root package';0
(parent_id=0 标记根包)
所以层次结构是:
First root package
|
+--First Package
|
+--Second package
|
+--First object
+--Second object
Second root package
|
+--Third object
+--Third package
|
+--Fourth object
我想要的结果:
t_object_with_root_package:
id;name;package_id;root_package_id
1;'First object';11;13
2;'Second object';11;13
3;'Third object';14;14
4;'Fourth object';12;14
感谢您的帮助
【问题讨论】:
-
编辑您的问题并提供示例数据和所需结果。
-
附加问题:你确定你使用的是(非常)过时的版本,8.4?而不是它最初基于它的变体之一(例如 redshift、greenplum 等)?
-
我绝对确定版本。这是一个纯 Postgresql 8.4。是的,它已经过时了^^
-
这
parent_id = 0标记根实体吗? (我不得不说,这有点奇怪。)通常parent_id = package_id或parent_id IS NULL标记根实体,因为这样,您也可以创建自引用外键。 -
我无法修改数据库架构。
标签: sql postgresql recursion recursive-query