J'ai des données de parent-enfant dans Excel qui est chargé dans un système tiers exécutant le serveur MS SQL. Les données représentent un graphique acyclique dirigé (espérons-le). 3ème partie signifie que je n'ai pas une main complètement libre dans le schéma. Les données excel sont une concaténation d'autres fichiers et la possibilité existe que dans les références croisées entre les différents fichiers quelqu'un ait provoqué une boucle - ie X est un enfant de Y (X-> Y) alors ailleurs (Y-> A- > BX). Je peux écrire vb, vba etc sur Excel ou sur le serveur SQL db. Le fichier Excel compte près de 30 000 lignes donc je m'inquiète d'une explosion combinatoire alors que les données vont augmenter. Donc, certaines des techniques comme la création d'une table avec tous les chemins peuvent être assez compliquées. Je pense simplement à écrire un programme qui, pour chaque racine, effectue une traversée d'arbre à chaque feuille et si la profondeur devient supérieure à une valeur nominale, elle le signale.
De meilleures suggestions ou des indications sur la discussion précédente sont les bienvenues.SQL - détection des boucles dans les relations parents-enfants
Répondre
Vous pouvez utiliser un CTE récursive pour détecter les boucles:
with prev as (
select RowId, 1 AS GenerationsRemoved
from YourTable
union all
select RowId, prev.GenerationsRemoved + 1
from prev
inner join YourTable on prev.RowId = ParentRowId
and prev.GenerationsRemoved < 55
)
select *
from prev
where GenerationsRemoved > 50
Cela ne vous oblige à spécifier un niveau maximum de récursivité: dans ce cas, le CTE court à 55, et il sélectionne des lignes comme erronées avec plus de 50 enfants.
C'est à peu près ce que j'ai fait aussi. Ça marche bien. –
Je n'avais jamais entendu parler de CTE car mon expérience DB est en grande partie zSeries DB/2. Merci pour le pointeur vers eux. Je pense que j'ai maintenant la réponse à un certain nombre d'autres questions. – Wudang
Et trouvé un tutoriel décent ici http://msdn.microsoft.com/en-us/library/ms186243.aspx Merci les gars – Wudang
Que souhaitez-vous faire lorsqu'une boucle est détectée? – Fosco
Votre plafond arbitraire de «supérieur au niveau X = problème» peut être inexact si vous ne connaissez pas ou ne pouvez pas déterminer la profondeur maximale valide. Cette information est-elle disponible? –