2017-10-14 188 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