递归查询以获得所需的结果集
Recursive query to get desired resultset
我有三个表:Superobject、object_master 和 object_child。
SuperObject 包含 superobj_id 和 obj_id。 obj_master 包含有关 object 的所有详细信息。
Object_child 有两列:obj_id 和 child_id。它包含 object 及其 child。一个 child 也可以有一个子 child。所以,一个 object 可以有多个 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
上面 object 的所有 children 都返回给我,但不是我想要的格式。
递归查询的技巧是您需要将所有数据存储在联合的种子位和递归位的结果集中,以便您可以:A) 执行下一次查找,B) 显示select 在您构建的递归 CTE 上需要的任何东西。
因此,根据您的要求,我们需要存储根节点(您 select 从您的主 table 获取的第一个 objectid),然后递归地存储父节点和子节点 select.
此外,因为您希望该根节点完成所有递归查找的末尾,所以您需要在联合的递归位中保持 select 完成。
这看起来像:
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
我有三个表:Superobject、object_master 和 object_child。
SuperObject 包含 superobj_id 和 obj_id。 obj_master 包含有关 object 的所有详细信息。
Object_child 有两列:obj_id 和 child_id。它包含 object 及其 child。一个 child 也可以有一个子 child。所以,一个 object 可以有多个 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
上面 object 的所有 children 都返回给我,但不是我想要的格式。
递归查询的技巧是您需要将所有数据存储在联合的种子位和递归位的结果集中,以便您可以:A) 执行下一次查找,B) 显示select 在您构建的递归 CTE 上需要的任何东西。
因此,根据您的要求,我们需要存储根节点(您 select 从您的主 table 获取的第一个 objectid),然后递归地存储父节点和子节点 select.
此外,因为您希望该根节点完成所有递归查找的末尾,所以您需要在联合的递归位中保持 select 完成。
这看起来像:
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