当数据跨两个表建模时,如何获取父对象的所有子对象?

How to get all child objects of a parent when data modeled across two tables?

我有两个表 - Container 和 ContainerObjectRel

容器 - 高级对象存储在数据库中

ContainerObjectRel - 将保存容器的直接子(低级别)对象

请注意,容器的子对象可以是容器本身或叶对象。

Table结构如下:-

容器

CONTAINER_ID   UUID

ContainerObjectRel

OBJECT_ID  CONTAINER_ID UUID NAME CREATED_TIME

示例数据

当尝试通过递归 cte 实现所示的所需输出时,给定一个容器 ID,我想出了以下方法来仅检索直接的一级对象(在观察时显然不是所需的输出)

WITH SUBORDINATES AS (

  SELECT 
    PARENTOBJECT.NAME AS NAME,
    PARENTOBJECT.CONTAINER_ID AS CONTAINER_ID, 
    PARENTOBJECT.UUID AS UUID 
  FROM CONTAINEROBJECTREL as PARENTOBJECT 
  WHERE PARENTOBJECT.CONTAINER_ID = 1

      UNION ALL

  SELECT
    CHILDOBJECT.NAME AS NAME,
    CHILDOBJECT.CONTAINER_ID AS CONTAINER_ID, 
    CHILDOBJECT.UUID AS UUID 
  FROM CONTAINEROBJECTREL as CHILDOBJECT 
  INNER JOIN SUBORDINATES AS PARENT ON PARENT.UUID=CHILDOBJECT.UUID
)
SELECT * 
from SUBORDINATES

我希望避免递归查询多次以获得指定容器的所有叶对象。因此,尝试通过递归 CTE 来解决。

不确定如何观察我手头的这个问题,任何advice/hint都会有用。

已知:

  1. 与直接的一级对象(因此数据建模)相比,渲染容器的所有叶对象在我们的应用程序中需要最少的使用
  2. 必须解决 postgres 和 mssql 的问题

谢谢大家。我在 CTE 的递归项中重复相同的 table (CONTAINEROBJECTREL) 时犯了一个错误。

这是工作版本

WITH RECURSIVE SUBORDINATES AS (

SELECT CONTAINEROBJECTREL.GUID AS LEAF_GUID, CONTAINEROBJECTREL.NAME AS LEAF_NAME, CONTAINER.GUID AS PARENT_GUID 
FROM CONTAINER INNER JOIN CONTAINEROBJECTREL 
ON CONTAINER.CONTAINER_ID=CONTAINEROBJECTREL.CONTAINER_ID   
WHERE CONTAINER.CONTAINER_ID = 1 

UNION ALL   

SELECT CONTAINEROBJECTREL.GUID AS LEAF_GUID, CONTAINEROBJECTREL.NAME AS LEAF_NAME, CONTAINER.GUID AS PARENT_GUID 
FROM CONTAINER INNER JOIN CONTAINEROBJECTREL 
ON CONTAINER.CONTAINER_ID=CONTAINEROBJECTREL.CONTAINER_ID   
INNER JOIN SUBORDINATES ON SUBORDINATES.LEAF_GUID=CONTAINER.GUID ) 

SELECT *  from SUBORDINATES