IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Filtre dans Arborescence [2008]


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Par défaut Filtre dans Arborescence
    Bonjour à tous,

    Dans le cadre de la gestion d'un catalogue, nous recevons une table des produits (product), une table de catégorie de produit (Category) qui associe le produit à une catégorie (par exemple un portable est dans la catégorie notebook).
    En parallèle, nous avons une table qui contient l’arborescence de toutes les catégories du catalogue(ParentCategory).
    Nous gérons que certains produits et donc certaines catégories. Du coup une partie de l'arborescence que nous recevons est inutile. Par exemple, nous gérons principalement du parc pc et nous avons dans l'arborescence de la table à repasser ou de la tondeuse à barbe.
    J’essaie donc de ne sélectionner que la partie utile de l'arborescence.

    prenant un exemple concret:
    ParentCategory
    parentCategoryId CategoryId
    1 1
    1 2
    1 3
    1 6
    2 4
    4 5
    3 7
    6 8
    8 9

    Je ne gère que des produits qui ont la catégorie 5.
    Le résultat voulut est donc :
    parentCategoryId CategoryId
    1 2
    2 4
    4 5

    En SQL direct je récupérè le résultat suivant:
    parentCategoryId CategoryId
    1 1
    1 2
    1 3
    1 6
    2 4
    4 5
    6 8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    ;with parentCategory(ParentCategoryId,CategoryId) 
    	as (select 1,1
    		Union select 1,2
    		Union select 1,3
    		Union select 1,6
    		Union select 2,4
    		Union select 4,5
    		Union select 3,7
    		Union select 6,8
    		Union select 8,9
    	 )		 
    ,CategoryGere as(select 5 CategoryId )
    select distinct PC.*
    from ParentCategory PC
    	left join ParentCategory enf on enf.ParentCategoryId= PC.CategoryId
    	left join CategoryGere C on PC.CategoryId=C.CategoryId
    where enf.CategoryId is not null or (enf.CategoryId is null and C.CategoryId is not null)
    Je garde donc les catégories parents de catégories que je ne gère pas.

    Je ne suis pas à l'aise avec la notion de récursivité en sql. et j'ai du mal à l'appliquer à mon cas.

    Auriez vous une piste pour résoudre mon problème?

    Merci d'avance.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    il faudra en effet passer par une requête récursive :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    ;with parentCategory(ParentCategoryId,CategoryId) 
    	as (select 1,1
    		Union select 1,2
    		Union select 1,3
    		Union select 1,6
    		Union select 2,4
    		Union select 4,5
    		Union select 3,7
    		Union select 6,8
    		Union select 8,9
    	 )		 
    , rec AS (
    	SELECT ParentCategoryId,CategoryId
    	FROM parentCategory
    	WHERE CategoryId = 5
    	UNION ALL
    	SELECT p.ParentCategoryId,p.CategoryId
    	FROM	rec e
    	INNER JOIN parentCategory p
    		ON P.CategoryId = e.ParentCategoryId
    		AND P.CategoryId <> p.ParentCategoryId
    )
    SELECT ParentCategoryId,CategoryId
    FROM rec

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Par défaut
    Avec la solution, je me rend compte que je faisais ma requête récursive dans le "mauvais sens".

    Merci beaucoup.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    En effet, puisque l'information dont vous disposez est un noeud enfant, il parait plus logique de partir des enfant pour remonter l'arborescence.

    Cependant, il serait possible (mais certainement moins performant) de partir de la racine et de construire l'arborescence, et ne garder au final que celle passant par l'enfant voulu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    ;with parentCategory(ParentCategoryId,CategoryId) 
    	as (select 1,1
    		Union select 1,2
    		Union select 1,3
    		Union select 1,6
    		Union select 2,4
    		Union select 4,5
    		Union select 3,7
    		Union select 6,8
    		Union select 8,9
    	 )	
    , rec AS (
    	SELECT 
    		p.ParentCategoryId,
    		p.CategoryId,
    		e.CategoryId AS descendant
    	FROM parentCategory p
    	LEFT JOIN parentCategory e
    		ON	e.ParentCategoryId = p.CategoryId
    	UNION ALL
    	SELECT 
    		p.ParentCategoryId,
    		p.CategoryId,
    		e.CategoryId
    	FROM rec p
    	INNER JOIN parentCategory e
    		ON	e.ParentCategoryId = p.descendant
    	WHERE p.ParentCategoryId <> p.descendant
    )
    select ParentCategoryId, CategoryId
    from rec
    where descendant = 5
    or categoryid = 5

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Configurer un filtre dans le détail
    Par drpark dans le forum DirectX
    Réponses: 6
    Dernier message: 02/08/2006, 15h53
  2. Filtre dans un sous-formulaire
    Par moto25 dans le forum IHM
    Réponses: 14
    Dernier message: 10/11/2005, 09h16
  3. [VB.NET] filtre dans base de donnée
    Par speedtug dans le forum Windows Forms
    Réponses: 7
    Dernier message: 21/09/2005, 17h12
  4. Application d'un filtre dans sous form (syntaxe)
    Par samlepiratepaddy dans le forum Access
    Réponses: 12
    Dernier message: 15/09/2005, 21h32
  5. Probleme de filtre dans bdd
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/06/2002, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo