Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 递归查询以获取所需的结果集_Postgresql_Recursive Query - Fatal编程技术网

Postgresql 递归查询以获取所需的结果集

Postgresql 递归查询以获取所需的结果集,postgresql,recursive-query,Postgresql,Recursive Query,我有三个表:Superobject、object\u master和object\u child SuperObject包含SuperObject_id和obj_id。obj_master包含有关该对象的所有详细信息 Object_child有两列:obj_id和child_id。它包含Object及其子对象。孩子也可以有一个子孩子。因此,一个对象可以有多个子对象 SuperObject Table object_child table sobj1

我有三个表:Superobject、object\u master和object\u child

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

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

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

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

递归查询的技巧是,您需要将所有数据存储在union的种子位和递归位的结果集中,这样您就可以: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

非常感谢内维尔。。。您对处理递归查询的出色解释将永远是一个很大的帮助:)