2010-04-07 16 views
1

Il ya quelques semaines, j'ai demandé a question sur la façon de générer du code hiérarchique XML à partir d'une table, qui a une colonne parentID. Tout fonctionne bien. Le point est, selon la hiérarchie, je veux aussi interroger une table.Requête pour les lignes, y compris les lignes enfant

Je vais vous donner un exemple:

Cest la table avec les codes:

ID   CODE   NAME            PARENTID 
1   ROOT   IndustryCode          NULL 
2   IND   Industry           1 
3   CON   Consulting           1 
4   FIN   Finance           1 
5   PHARM  Pharmaceuticals         2 
6   AUTO   Automotive           2 
7   STRAT  Strategy           3 
8   IMPL   Implementation          3 
9   CFIN   Corporate Finance         4 
10   CMRKT  Capital Markets         9 

D'où je produis (pour l'affichage dans un TreeViewControl) ce XML:

<record key="1" parentkey="" Code="ROOT" Name="IndustryCode"> 
    <record key="2" parentkey="1" Code="IND" Name="Industry"> 
    <record key="5" parentkey="2" Code="PHARM" Name="Pharmaceuticals" /> 
    <record key="6" parentkey="2" Code="AUTO" Name="Automotive" /> 
    </record> 
    <record key="3" parentkey="1" Code="CON" Name="Consulting"> 
    <record key="7" parentkey="3" Code="STRAT" Name="Strategy" /> 
    <record key="8" parentkey="3" Code="IMPL" Name="Implementation" /> 
    </record> 
    <record key="4" parentkey="1" Code="FIN" Name="Finance"> 
    <record key="9" parentkey="4" Code="CFIN" Name="Corporate Finance"> 
     <record key="10" parentkey="9" Code="CMRKT" Name="Capital Markets" /> 
    </record> 
    </record> 
</record> 

Comme vous pouvez le voir, certains codes sont subordonnés à d'autres, par exemple AUTO < < IND < < ROOT

Ce que je veux (et ont absolument aucune idée de réaliser ou même, par où commencer) est de pouvoir requête une autre table (où une colonne est-ce certain code bien sûr) un code et d'obtenir tous les enregistrements avec le code spécifique et tous les codes subordonnés

par exemple: J'interroger l'autre table pour « IndustryCode = IND [ustry] » et obtenir (bien sûr) les dossiers contenant « IND », mais aussi AUTO [motive] et PHARM [aceutical] (= tous les subordonnés)

C'est un SQL Express Server 2008 avec Services avancés

+0

Merci pour vos réponses jusqu'à présent, je vais essayer tous! Mais je dois emballer (depuis son 6 PM ici maintenant =)) –

Répondre

0

La façon dont je le fais habituellement est d'ajouter une colonne keychain. Pour vos données:

 
ID   PARENTID  KEYCHAIN 
1   NULL   1 
2   1    1.2 
3   1    1.3 
4   1    1.4 
5   2    1.2.5 
6   2    1.2.6 
7   3    1.3.7 
8   3    1.3.8 
9   4    1.4.9 
10   9    1.4.9.10 

Cette colonne aurait évidemment être calculé à l'aide d'insérer l'identifiant généré, mais une fois qu'il est là-bas, vous pouvez écrire votre requête tout simplement. Il y a probablement d'autres façons de faire cela, mais j'ai trouvé que cette méthode fonctionne plutôt bien.

+0

Vous pouvez également utiliser la méthode des ensembles imbriqués, mais Keychain semble plus simple et n'a besoin que d'un champ supplémentaire à remplir – vittore

+0

comment calculer le trousseau? Il doit y avoir une sorte de récursivité, je suppose? –

+0

@ MAD9, Oui ce serait une forme de récursivité. Pour une ligne, bien que vous puissiez écrire 'UPDATE mytable t1 SET KEYCHAIN ​​= (CHOISIR KEYCHAIN ​​FROM mytable t2 O WH t1.PARENTID = t2.ID) + '.' + ID' – Joel

1

Utilisation:

WITH hierarchy AS (
    SELECT x.code 
    FROM TABLE x 
    WHERE x.code = @root_code 
    UNION ALL 
    SELECT y.code 
    FROM TABLE y 
    JOIN hierarchy h ON h.id = y.parentid) 
SELECT z.code 
    FROM hierarchy z 

Il est typique (maintenant la norme ANSI) hierarchical query - il y a beaucoup à trouver sur google à leur sujet.

Questions connexes