【发布时间】:2022-01-30 10:41:19
【问题描述】:
我是一名前端开发人员,但我开始编写后端的东西。我花了相当多的时间试图弄清楚如何解决这个问题。我真的需要一些帮助。
以下是两个表的简化定义和关系:
CREATE TABLE IF NOT EXISTS items (
item_id uuid NOT NULL DEFAULT gen_random_uuid() ,
parent_id uuid DEFAULT NULL ,
parent_table parent_tables NOT NULL
);
CREATE TABLE IF NOT EXISTS collections (
collection_id uuid NOT NULL DEFAULT gen_random_uuid() ,
parent_id uuid DEFAULT NULL
);
我们的产品是一个在线文档协作工具,页面可以有嵌套页面。
我有一段 PostgreSQL 代码用于获取给定 item_ids 的所有祖先记录。
WITH RECURSIVE ancestors AS (
SELECT *
FROM items
WHERE item_id in ( ${itemIds} )
UNION
SELECT i.*
FROM items i
INNER JOIN ancestors a ON a.parent_id = i.item_id
)
SELECT * FROM ancestors
它适用于嵌套常规页面,但是如果我要支持嵌套集合页面,这意味着某些项目的 parent_id 可能引用“集合”表的集合 ID,此代码将不再工作。根据我有限的经验,我认为纯 SQL 代码无法解决。我认为编写一个 PL/pgSQL 函数可能是一个解决方案,但我需要将所有祖先记录获取给给定的itemIds,这意味着返回项目和集合记录的混合。
那么如何从单个 PL/pgSQL 函数返回不同格式的记录呢?我做了一些研究,但没有找到任何例子。
【问题讨论】:
-
我发现我可以使用 RECORD 类型。
-
您可以返回匿名记录。但通常情况下,我不会去那里。见:stackoverflow.com/a/62687780/939860
标签: postgresql plpgsql common-table-expression recursive-query