当数据跨两个表建模时,如何获取父对象的所有子对象?
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都会有用。
已知:
- 与直接的一级对象(因此数据建模)相比,渲染容器的所有叶对象在我们的应用程序中需要最少的使用
- 必须解决 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
我有两个表 - 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都会有用。
已知:
- 与直接的一级对象(因此数据建模)相比,渲染容器的所有叶对象在我们的应用程序中需要最少的使用
- 必须解决 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