Le tableau 1 contient une liste d'éléments. Le tableau 2 contient une liste de groupes auxquels les éléments peuvent être associés. Le tableau 3 est une référence croisée entre 1 et 2.La meilleure façon de filtrer les données hiérarchiques en utilisant T-SQL?
Les groupes du tableau 2 sont configurés de façon hiérarchique.
Key ParentKey Name
1 NULL TopGroup1
2 NULL TopGroup2
3 1 MiddleGroup1
4 2 MiddleGroup2
5 3 NextGroup1
6 4 NextGroup1
7 2 MiddleGroup3
Je veux être en mesure de sélectionner parmi Table1 filtré par Table3.
Sélectionnez les éléments de Table1 où Table3.ParentKey NOT '2' ou l'un de ses descendants.
D'un autre article here on stackoverflow J'ai pu utiliser CTE pour identifier la hiérarchie.
WITH Parent AS
(
SELECT
table2.Key,
cast(table2.Key as varchar(128)) AS Path
FROM
table2
WHERE
table2.ParentKey IS NULL
UNION ALL
SELECT
TH.Key,
CONVERT(varchar(128), Parent.Path + ',' + CONVERT(varchar(128),TH.Key)) AS Path
FROM
table2 TH
INNER JOIN
Parent
ON
Parent.Key = TH.ParentKey
)
SELECT * FROM Parent
Je suppose que c'est vraiment une question en deux parties.
- Comment filtrez-vous ce qui précède? Par exemple, renvoyez tous les groupes dans lesquels TopGroup1 n'est pas dans le lignage.
- Comment l'appliquer aux résultats de filtrage dans le tableau croisé1.