2008-11-05 11 views
0

Ma table a le schéma suivant:Comment récupérer du XML hiérarchique dans t-sql?

id, id_parent, texte

Étant donné les données suivantes, je voudrais revenir une hiérarchie xml:

données: (1, null, 'x') (2,1, 'y'), (3,1, 'z'), (4,2, 'a')

XML:
[texte rangée = "x"]
[rangée text = "y"]
[row text = "a" /]
[/ ligne]
[texte row = "z" /]
[/ ligne]


Ajouté: le hierachy n'a pas de profondeur maximale

Répondre

-1

Cela exige une "fermeture transitive". Vous devez traiter les données de manière récursive pour trouver tous les enfants sous un parent donné.

En gros, l'algorithme ressemble à ceci.

for top in cursor(nodes where each parent==null): 
    build_tree(top) 

def build_tree(parent): 
    emit opening tag 
    for child in cursor(nodes where parent == parent): 
     build_tree(child) 
    emit closing tag 

Notez que certains interprètes SQL peuvent avoir des problèmes avec la récursion - ils ne peuvent pas ouvrir un nouveau, nouveau curseur au besoin. Cependant, chaque curseur doit être distinct, car vous aurez autant de curseurs ouverts que votre arbre a de niveaux.

1

Si vous avez une profondeur finie, il y a l'un quickie qui ressemble à ceci:

SELECT T.*, T2.*, T3.* /*, ...*/ FROM myTable T 
INNER JOIN myTable T2 ON T2.parent_id=T.id 
INNER JOIN myTable T3 ON T3.parent_id=T2.id 
/* ... */ 
WHERE T.parent_id IS NULL 
FOR XML AUTO 

Je ne suis pas sûr, mais il pourrait être possible de concevoir un résultat similaire en utilisant recursive queries. Bien sûr, c'est beaucoup plus facile (et cela a probablement plus de sens) au niveau de l'application.