0

Je voulais trouver le type topologique d'un DAG.Pouvons-nous utiliser la sortie d'une requête récursive dans une autre requête récursive?

create table topo(
v1 int, 
v2 int 
); 

Insert into topo values (1,3),(2,5),(3,4),(4,5),(4,6),(5,7),(6,5),(7,null) 

WITH RECURSIVE path(S,d) AS(
select t1.v1, 0 from topo t1 left outer join topo as t2 on t1.v1=t2.v2 
where t2.v2 IS null 
UNION ALL 
select distinct t1.v2, path.d + 1 from path inner join topo as t1 on 
t1.v1=path.S 
) 
select S from path group by S order by MAX(d); 

Ce code donne la sortie de l'ordre topologique d'un graphe. Maintenant, je veux utiliser cette sortie dans une autre requête récursive pour trouver le chemin d'un sommet à l'autre. Puis-je utiliser la sortie générée par ce code dans une autre requête récursive?

J'essayais de le faire normalement, mais la sortie montrait une erreur.

+0

Pourriez-vous obtenir ce chemin en ajoutant un nouveau champ au CTE récursif existant? – JNevill

+0

Comment? Supposons que je veux obtenir le chemin de 3 à 7. Est-ce possible sans écrire une autre requête récursive? – user3503711

Répondre

1

Ajouter à votre sql récursif existant pour obtenir le chemin:

WITH RECURSIVE path AS(
select 
    t1.v1 as start, 
    t1.v2 as end, 
    CAST(t1.v1 as VARCHAR(30)) as path 
    0 as depth 
from topo t1 
    left outer join topo as t2 on t1.v1=t2.v2 
where t2.v2 IS null 

UNION ALL 
select 
    path.start , 
    t1.v2 as end, 
    path.path || '>' || t1.v1,  
    path.d + 1 
from path 
    inner join topo as t1 on t1.v1=path.end 
) 
SELECT * FROM path 

simple ajout dans quelques autres domaines pour suivre ce qui se passe que vous traversez votre hiérarchie. Start sera statique à partir de la première requête. Ce sera 1 pour chaque enregistrement puisque c'est votre point de départ. End est le nœud sur lequel vous travaillez actuellement. path concaténera le noeud final à chaque nouvelle recherche. depth vous dira dans quelle mesure vous avez traversé.