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

时间:2015-10-12 14:13:19

标签: postgresql recursive-query

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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