我有一个名为“Items”的 SQL (Postgres) 表,具有以下架构。
id | parent_id | name
其中 parent_id
列是同一表的外键。 (例如,项目具有父项目,并且这些项目可以具有父项目)
这形成了一个简单的分支层次结构。
目前,我查询特定记录并使用 for 循环
来获取其每个父项/子项。
这会导致执行大量查询。
我想要做的是使用其中一项的 id 查询此表,并使用单个查询返回其所有父项/子项。
我可以通过对子项使用 .select_lated(“parent__parent”)
或 .prefetch_lated(“item_set”)
来完成此操作,但这两种方法都需要了解事先确定层次结构的深度。
Django 中有没有办法在单个查询中获取所有相关行? 原始 SQL 也很好。
最佳答案
这是一个用于获取记录的父级和子级层次结构的递归解决方案。
select * from
(WITH RECURSIVE cte_items (id, name, parent_id) AS (
SELECT id, name, parent_id
FROM items
WHERE id = 1
UNION ALL
SELECT e.id, e.name, e.parent_id
FROM items e
INNER JOIN cte_items o ON o.id = e.parent_id)
SELECT id, name, parent_id FROM cte_items) child
union
select * from
(WITH RECURSIVE cte_items (id, name, parent_id) AS (
SELECT id, name, parent_id
FROM items
WHERE id = 1
UNION ALL
SELECT e.id, e.name, e.parent_id
FROM items e
INNER JOIN cte_items o ON o.parent_id = e.id)
SELECT id, name, parent_id FROM cte_items) parent
order by parent_id
<小时/>
关于python - 获取表中记录的所有 parent / child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60350456/