gpt4 book ai didi

postgresql - 递归查询以获得所需的结果集

转载 作者:行者123 更新时间:2023-11-29 13:26:27 25 4
gpt4 key购买 nike

我有三个表:Superobject、object_master 和 object_child。

SuperObject 包含 superobj_id 和 obj_id。 obj_master 包含有关对象的所有详细信息。

Object_child 有两列:obj_id 和 child_id。它包含对象及其子对象。一个 child 也可以有一个子 child 。因此,一个对象可以有多个子对象。

SuperObject Table                object_child table

sobj1 obj1 obj1 ch_obj1
sobj1 obj2 obj1 ch_obj2
sobj1 obj3 ch_obj1 ch_obj3

我想要以下格式的结果集:

obj1      ch_obj1
obj1 ch_obj2
obj1 ch_obj3
obj2 ------
obj2 ------
obj3 ------

我正在使用以下查询:

with recursive objects as (
select objectid
from object_masster
where objectid in (obj1, obj2, obj3)
union
select a.child_id
from object_child a a join objects b on a.objectid = b.objectid
)
select * from objects

它会返回上述对象的所有子项,但不是所需的格式。

最佳答案

递归查询的技巧是您需要将所有数据存储在联合的种子位和递归位的结果集中,这样您就可以:A) 执行下一次查找,B) 显示您想要的任何内容当您选择已构建的递归 CTE 时需要。

因此,根据您的要求,我们需要存储根节点(您从主表中选择的第一个 objectid),然后是我们递归选择的父节点和子节点。

此外,因为您希望该根节点通过所有递归查找的末尾,所以您需要在联合的递归位中继续选择它。

这看起来像:

WITH RECURSIVE objects AS (
SELECT objectid AS root, CAST(NULL AS VARCHAR(10)) AS parent, objectid AS child
FROM object_master
WHERE objectid IN (obj1, obj2, obj3)

UNION

SELECT b.root AS root, b.child AS parent, a.child_id AS child
FROM object_child a
INNER JOIN objects b
ON a.objectid = b.child
)
SELECT root, child FROM objects

关于postgresql - 递归查询以获得所需的结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33083378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com