2017-10-14 101 views
1

我有一個SQLite表的子ID和他們的父母ID。如果給定的父母也可能出現在子列中。例如:尋找與遞歸CTE的最終父母

child parent 
----- ------ 
3  4 
2  3 
1  2 
5  4 
7  8 
6  7 

我想從遞歸結構轉換這對那裏的孩子在一列,其最終母公司(即保留所有recusing完成後父)中列出的表中列出其他。例如,上表中會導致:

child ultimate_parent 
----- --------------- 
3  4 
2  4 
1  4 
5  4 
7  8 
6  8 

據我所知,這應該使用SQLites遞歸的CTE是可能的,但我有麻煩開發查詢。以下是我目前爲止的內容,但顯然不完整。

WITH RECURSIVE rel(child, parent) AS (
     SELECT child, parent FROM relationships 
     UNION ALL 
     SELECT child, parent FROM rel 
    ) 
    SELECT * FROM rel; 

任何幫助將不勝感激。

一種用於例如錶轉儲上述

PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE `relationships` (
    `child` INTEGER, 
    `parent` INTEGER 
); 
INSERT INTO relationships VALUES(3,4); 
INSERT INTO relationships VALUES(2,3); 
INSERT INTO relationships VALUES(1,2); 
INSERT INTO relationships VALUES(5,4); 
INSERT INTO relationships VALUES(7,8); 
INSERT INTO relationships VALUES(6,7); 
COMMIT; 
+0

請提供數據庫結構和stuitably量身定製的小型數據庫的樣本內容作爲'.dump'(即行'創建桌子......「和」插入......「)。 – Yunnosch

回答

0

遞歸步驟必須使用數據來自前面步驟和原始表來計算數據用於下一步驟:

而CTE會產生所有可能的直接和間接父母;你必須篩選出最終的父母,也就是那些沒有孩子的父母:

WITH ... 
SELECT * 
FROM rel 
WHERE parent NOT IN (SELECT child 
        FROM relationships); 
+0

非常感謝!我知道我需要以某種方式使用上一步來獲得下一個,但不知道是什麼樣子。 。 。現在我做了。 – Chris