2010-09-08 5 views
1

J'ai besoin de retourner une relation parent-enfant à partir de 3 tables qui sont respectivement pour le bas, le milieu et le haut. choses faciles jusqu'à présent, et déjà fait:construire une hiérarchie à partir de 3 tables

SELECT -1 ParentID, ID + 100000 ID, txtName Value from tblLevel1 
UNION 
SELECT Level1ID + 100000 ParentID, ID + 50000 ID, txtName Value from tblLevel2 
UNION 
SELECT Level2ID + 50000 ParentID, ID ID, txtName Value from tblLevel3 

Mon problème est que je dois ajouter un autre champ qui décrit le chemin de chaque entrée.

Pour la première table, il s'agit de '-1; {id}).
Pour la deuxième table est is '{Level1id}; {id}'.
La requête de la troisième table doit renvoyer '{Level1id}; {Level2id}; {id}'. Le problème est le troisième alors. Les structures de table sont les suivantes:

Niveau 1; ID int; txtName varchar(50)

Niveau 2; ID int; Level1ID int; txtName varchar(50)

Niveau3; ID int; Level2ID int; txtName varchar(50)

Comment obtenir le chemin d'accès complet dans la requête sur la 3ème table (Niveau3)?

Ceci est le résultat courant

ParentID ID  Value 
-1  100001 Test company 
-1  100006 Company A 
-1  100007 Company B 
-1  100008 The Primary Client 
-1  100009 Overseas Client 1 
100001 50001 Distribution 
100006 50016 Attributes 
100007 50018 Attributes 
100008 50019 Development 
100009 50029 Database 
50001 1  Balance Sheet 
50001 7  Cash Flow Statement 
50001 10  Income Statement 
50016 20  Vehicles 
50016 21  Drivers 
50019 33  Health 
50029 29  Database 
+0

Il serait plus facile si vous deviez montrer quelques exemples de données et le résultat attendu une requête. –

Répondre

2

Je doute la conception de votre base de données, comme la table distincte pour chaque « niveau » semble être une mauvaise idée pour moi. Comme je ne connais pas toutes les spécificités de votre application, je suppose pour l'instant que c'est comme ça que ça doit être. En outre, toute l'affaire d'ajouter des numéros aux IDs me ressemble comme un gros kludge qui va vous mordre plus tard. Un autre problème, plus immédiat et plus contraignant, est que vous voulez que votre troisième jeu de résultats ait un nombre de colonnes différent de celui des deux premiers jeux de résultats. Ce n'est tout simplement pas possible avec un opérateur UNION.

Si vous souhaitez ajouter une autre colonne aux deux premières requêtes, vous devriez pouvoir obtenir ce que vous voulez dans la troisième requête simplement en joignant les tables de niveau 3 et de niveau 2 pour obtenir l'ID de niveau 1.

+0

Je vais supposer pour le moment que c'est comme ça que ça doit être C'est correct. Je dois réorganiser un système existant, et le faire page par page, en utilisant des contrôles plus modernes. malheureusement, la douleur de traiter avec de fausses hiérarchies et plus est né pour l'instant. Merci pour votre contribution. Avoir un bateau à moteur. – callisto

1

a résolu le problème en se joignant au niveau 2 dans la sélection au niveau 3:

SELECT -1 ParentID, ID + 100000 ID, txtName Value, '-1;'+ cast(ID as varchar(10)) nodePath from tblLevel1 
UNION 
SELECT Level1ID + 100000 ParentID, ID + 50000 ID, txtName Value, '-1;'+ cast(Level1ID as varchar(10))+ ';'+ cast(ID as varchar(10)) nodePath from tblLevel2 
UNION 
SELECT Level2ID + 50000 ParentID, ID ID, txtName Value '-1;'+ cast(p.Level1ID as varchar(10))+ ';'+cast(m.Level2ID as varchar(10))+ ';'+cast(m.ID as varchar(10)) nodePath from tblLevel3 
inner join tblLevel2 p on p.ID = m.Level2ID 

Résultats:

-1  100001 RRM Financial Master Templates -1;1 
-1  100006 Company A      -1;6 
-1  100007 Company B      -1;7 
-1  100008 The Primary Client    -1;8 
-1  100009 Overseas Client 1    -1;9 
100001 50001 Distribution     -1;1;1 
100006 50016 Attributes      -1;6;16 
100007 50018 Attributes      -1;7;18 
100008 50019 Development      -1;8;19 
100009 50029 Database      -1;9;29 
50001 1  Balance Sheet     -1;1;1;1 
50001 7  Cash Flow Statement    -1;1;1;7 
50001 10  Income Statement    -1;1;1;10 
50016 20  Vehicles      -1;6;16;20 
50016 21  Drivers       -1;6;16;21 
50019 33  Health       -1;8;19;33 
50029 29  Database      -1;9;29;29 
Questions connexes