2016-10-03 23 views
0

您好讓我們假設我有一個遞歸表是這樣的:如何查詢一個遞歸表,避免寄存器父親和孩子在PostgreSQL

ID Name Father_ID 
1 A  -- 
2 B  1 
3 C  2 
4 D  2 
5 E  4 
6 F  1 
7 G  6 
8 H  1 

例如,我不需要,ID爲寄存器到2或6,但我不需要他們是Father_ID寄存器。因爲它的父親是4,所以ID = 5的寄存器沒有考慮到,但是同時4具有作爲father_ID的數字2(與深度搜索一樣)。這將是最終的結果。

ID Name Father_ID 
1 A  -- 
8 H  1 

什麼可能是一個很好的方法來執行此操作?

(這只是一個更復雜的查詢的一部分)

問候。

+0

我完全沒有得到您的問題。你想要的輸出是什麼? – Teja

+0

謝謝。我的錯誤,我編輯了這篇文章。 – d2907

+0

https://www.postgresql.org/docs/current/static/queries-with.html –

回答

0
WITH RECURSIVE ancestors(id) AS 
    (SELECT id 
     FROM register 
     WHERE id NOT IN (2, 6) 
     AND father_id IS NULL 
    UNION 
    SELECT r.id 
     FROM register r 
      JOIN ancestors a 
       ON r.father_id = a.id 
     WHERE r.id NOT IN (2, 6) 
    ) 
SELECT r.* 
FROM ancestors 
    NATURAL JOIN register r; 

┌────┬──────┬───────────┐ 
│ id │ name │ father_id │ 
├────┼──────┼───────────┤ 
│ 1 │ A │   │ 
│ 8 │ H │   1 │ 
└────┴──────┴───────────┘ 
(2 rows)