Je dois suivre les données dans SQL Server 2008 R2. SQLFiddle
Schéma:
CREATE TABLE [dbo]. [ICFilters] ( [ICFilterID] [int] IDENTITY (1,1) NOT NULL, [ParentID] [int] NOT NULL DEFAULT 0, [FilterDesc] [varchar] (50) NOT NULL, [Active] [tinyint] NOT NULL DEFAULT 1, CONTRAINTE [PK_ICFilters] CLÉ PRIMAIRE CLUSTERED ([ICFilterID] ASC) AVEC PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) LE [PRIMAIRE] ) LE [PRIMAIRE] INSERT INTO [dbo]. [ICFilters] (ParentID, FilterDesc, Active) Valeurs (0, «Type de produit», 1), (1, «ProdSubType_1», 1), (1, «ProdSubType_2», 1), (1, «ProdSubType_3», 1), (1, «ProdSubType_4», 1), (2, 'PST_1.1', 1), (2, 'PST_1.2', 1), (2, «PST_1.3», 1), (2, «PST_1.4», 1), (2, «PST_1.5», 1), (2, «PST_1.6», 1), (2, 'PST_1.7', 0), (3, «PST_2.1», 1), (3, 'PST_2.2', 0), (3, «PST_2.3», 1), (3, «PST_2.4», 1), (14, «PST_2.2.1», 1), (14, «PST_2.2.2», 1), (14, «PST_2.2.3», 1), (3, 'PST_2.8', 1)
Table:
| ICFILTERID | PARENTID | FILTERDESC | ACTIF | -------------------------------------------------- | 1 | 0 | Type de produit | 1 | | 2 | 1 | ProdSubType_1 | 1 | | 3 | 1 | ProdSubType_2 | 1 | | 4 | 1 | ProdSubType_3 | 1 | | 5 | 1 | ProdSubType_4 | 1 | | 6 | 2 | PST_1.1 | 1 | | 7 | 2 | PST_1.2 | 1 | | 8 | 2 | PST_1.3 | 1 | | 9 | 2 | PST_1.4 | 1 | | 10 | 2 | PST_1.5 | 1 | | 11 | 2 | PST_1.6 | 1 | | 12 | 2 | PST_1.7 | 0 | | 13 | 3 | PST_2.1 | 1 | | 14 | 3 | PST_2.2 | 0 | | 15 | 3 | PST_2.3 | 1 | | 16 | 3 | PST_2.4 | 1 | | 17 | 14 | PST_2.2.1 | 1 | | 18 | 14 | PST_2.2.2 | 1 | | 19 | 14 | PST_2.2.3 | 1 | | 20 | 3 | PST_2.8 | 1 |
Chaque ligne a l'ID de son parent et celle de la racine parentid = 0
. Les FilterDesc
s ne sont que des exemples de descriptions, donc je ne peux pas essayer de les analyser pour les commander.
La question
Est-il possible de sélectionner toutes les lignes de manière arborescente? Si c'est le cas, comment? Quand je dis «en forme d'arbre», je veux dire sélectionner récursivement le parent suivi de tous ses enfants, puis tous les enfants de chacun d'entre eux et ainsi de suite. Une première traversée d'arbre en profondeur.
Mes amis et moi avons essayé mais nous n'avons pas réussi à trouver des solutions de travail, mais nous continuerons d'essayer. Je suis assez nouveau dans sql, alors peut-être que cela peut être fait facilement et je rends les choses plus difficiles que nécessaire.
Exemple de sortie (souhaitée):
| ICFILTERID | PARENTID | FILTERDESC | ACTIF | -------------------------------------------------- | 1 | 0 | Type de produit | 1 | | 2 | 1 | ProdSubType_1 | 1 | | 6 | 2 | PST_1.1 | 1 | | 7 | 2 | PST_1.2 | 1 | | 8 | 2 | PST_1.3 | 1 | | 9 | 2 | PST_1.4 | 1 | | 10 | 2 | PST_1.5 | 1 | | 11 | 2 | PST_1.6 | 1 | | 12 | 2 | PST_1.7 | 0 | | 3 | 1 | ProdSubType_2 | 1 | | 13 | 3 | PST_2.1 | 1 | | 14 | 3 | PST_2.2 | 0 | | 17 | 14 | PST_2.2.1 | 1 | | 18 | 14 | PST_2.2.2 | 1 | | 19 | 14 | PST_2.2.3 | 1 | | 15 | 3 | PST_2.3 | 1 | | 16 | 3 | PST_2.4 | 1 | | 20 | 3 | PST_2.8 | 1 | | 4 | 1 | ProdSubType_3 | 1 | | 5 | 1 | ProdSubType_4 | 1 |