0
votes

Requête récursive SQL pour naviguer et retourner

J'ai une table hiérarchique utilisée pour stocker des constructions de pièces. Le schéma est simple que la table stocke un composant et son parent. | - Compontation-- | --parent-- | . J'utilise une expression de table commune pour créer la liste des pièces des pièces parentaux, et cela fonctionne sans problème.

Le problème que je suis en cours consiste à déterminer la partie de niveau supérieur d'un composant interne. J'ai modifié le CTE pour construire une liste de pièces d'une partie interne, mais je rencontre des difficultés à retourner seulement la partie mère.

Cela pourrait être plus facile à expliquer en utilisant un exemple, alors s'il vous plaît voir ci-dessous. Dans l'exemple, la voiture et la moto sont les deux parties de niveau supérieur. Le seul moyen de déterminer que c'est qu'ils se trouvent dans la colonne parent , mais jamais dans la colonne (je n'ai pas de contrôle sur le schéma ou la façon dont Les données sont stockées). xxx

Ce retour: xxx

La seule solution que j'ai proposée est de < Code> Joindre Le résultat ci-dessus défini avec une sous-requête comme Sélectionnez FÉPARENT de la construction où la composante ne figure pas dans le composant mais il semble simplement être une solution inefficace aux problèmes.


2 commentaires

Quels sont vos résultats attendus?


@Peterhe j'ai essayé de pointer vers les deux enregistrements que j'attends dans la table des résultats. Il ne doit que renvoyer les deux enregistrements: Cadre moto 4 et porte de voiture 3


3 Réponses :


1
votes

Voici une façon de vous attaquer. Je suis sûr qu'il y en a d'autres.

DECLARE @Comp VARCHAR(20) = 'Screw';

WITH UsedPart
AS
(
    SELECT
        b.Parent,
        b.Component,
        Level = 1,
        RowNum = ROW_NUMBER() over(order by parent)
    FROM Build as b
    WHERE b.Component = @Comp
    UNION ALL
    SELECT
        b.Parent,
        b.Component,
        u.Level + 1,
        u.RowNum
    FROM Build as b
    INNER JOIN UsedPart as u
    ON b.Component = u.Parent
)
, SortedValues as
(
    SELECT *
        , MyVal = ROW_NUMBER() over(partition by RowNum order by Level desc)
    FROM UsedPart
)

select *
from SortedValues
where MyVal = 1


0 commentaires

1
votes

Vous pouvez simplement modifier le Select à:

SELECT u.*
FROM UsedPart u
WHERE NOT EXISTS(SELECT 1 FROM UsedPart p WHERE p.Component=u.Parent)


0 commentaires

0
votes

Essayez ceci:

select Parent
from build
where Parent not in (select Component from build)


0 commentaires