2010-07-12 13 views
4

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

+0

Que souhaitez-vous faire lorsqu'une boucle est détectée? – Fosco

+0

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? –

Répondre

4

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.

+0

C'est à peu près ce que j'ai fait aussi. Ça marche bien. –

+0

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

+1

Et trouvé un tutoriel décent ici http://msdn.microsoft.com/en-us/library/ms186243.aspx Merci les gars – Wudang