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. 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 em> la partie mère. p> 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 Ce retour: p> La seule solution que j'ai proposée est de < Code> Joindre Code> Le résultat ci-dessus défini avec une sous-requête comme | - Compontation-- | --parent-- | code>. 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.
parent code>, mais jamais dans la colonne code> code> (je n'ai pas de contrôle sur le schéma ou la façon dont Les données sont stockées). p>
Sélectionnez FÉPARENT de la construction où la composante ne figure pas dans le composant code> mais il semble simplement être une solution inefficace aux problèmes. P> p>
3 Réponses :
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
Vous pouvez simplement modifier le Select à:
SELECT u.* FROM UsedPart u WHERE NOT EXISTS(SELECT 1 FROM UsedPart p WHERE p.Component=u.Parent)
Essayez ceci:
select Parent from build where Parent not in (select Component from build)
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 code> et
porte de voiture 3 code>