簡體   English   中英

獲取表中記錄的所有父母/孩子

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM