[英]Get All Parents/ Children Of Record In Table
我有一個名為“Items”的 SQL (Postgres) 表,其架構如下。
id | parent_id | name
其中parent_id
列是同一個表的外鍵。 (例如項目有父項目,這些項目可以有父項目)
這構成了一個簡單的分支層次結構。
目前我查詢特定記錄並使用for loop
來獲取它的每個父/子。 這導致執行大量查詢。
我想要做的是使用其中一項的 id 查詢此表,並使用單個查詢返回其所有父/子。
我可以通過為孩子使用.select_related(“parent__parent”)
或.prefetch_related(“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
操作說明
我用以下內容修改了 Nicola 提供的很棒的代碼。
代碼更清晰一些,並且在表上執行的操作略少。
每個 SELECTS 中的where id = 1
是您要查詢的記錄的實際 ID。
WITH parents AS (
SELECT id, name, parent_id
FROM family
WHERE id = 1
UNION ALL
SELECT e.id, e.name, e.parent_id
FROM family e
INNER JOIN parents o ON e.id = o.parent_id)
, children as (
SELECT id, name, parent_id
FROM family
WHERE id = 1
UNION ALL
SELECT e.id, e.name, e.parent_id
FROM family e
INNER JOIN children o ON o.id = e.parent_id
)
SELECT id, name, parent_id FROM parents
UNION
SELECT id, name, parent_id FROM children;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.