2017-10-14 8 views
1

J'ai une table SQLite d'ID enfants et leur ID parent. Où un parent donné peut également apparaître dans la colonne enfant. Par exemple:recherche de parents ultimes avec CTE récursif

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

Je voudrais transformer ce de la structure récursive à une table où l'enfant est listé dans une colonne et sa société mère ultime (le parent qui reste après tout récusant se fait) est listé dans la autre. Par exemple, le tableau ci-dessus entraînerait:

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

Je comprends que cela devrait être possible en utilisant SQLites récursive CTEs, mais je ne parviens pas à développer la requête. Voici ce que j'ai jusqu'à présent, mais il est évidemment incomplet.

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

Toute aide serait grandement appréciée.

Une décharge de la table d'exemple ci-dessus

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

S'il vous plaît la structure de base de données fournir et le contenu de l'échantillon d'une base de données de jouets stuitably sur mesure comme '.dump' (c.-à-lignes de' créer table ... 'et" inséré dans ... "). – Yunnosch

Répondre

0

L'étape de récursivité doit utiliser les données de l'étape précédente et la table d'origine pour calculer les données pour l'étape suivante:

Et le CTE génère tous les parents directs et indirects possibles; vous devez filtrer parents ultimes, à savoir, les parents qui ne sont pas des enfants:

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

Merci beaucoup! Je savais que j'avais besoin d'utiliser l'étape précédente pour obtenir le suivant, mais je ne savais pas à quoi cela ressemblait. . . maintenant oui. – Chris