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

Développement SQL Server Discussion :

HierarchyId - récupérer tous les enfants de plusieurs parents


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut HierarchyId - récupérer tous les enfants de plusieurs parents
    Bonjour à tous,

    J'ai tenté de trouver une réponse sur le net ou dans ce forum mais sans succès, je tente donc ma chance en posant directement ma question.

    J'ai une table avec une colonne de type HierachyId et ma problématique est de trouver la requête la plus performante pour récupérer tous les enfants de plusieurs parents (root).

    J'ai tenté ce type de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  *
    FROM [maTable] Child
    JOIN [maTable] Parent ON Child.[Hierarchy_Id].IsDescendantOf(Parent.[Hierarchy_Id])=1 AND Parent.ID_FK IS NULL
    WHERE Child.ID_FK IS NOT NULL AND Parent.ID_PK IN (SELECT ...)
    Le retour de données est correct mais la requête est terriblement lente, pour renvoyer 100000 elements hierarchisés elle met environ 50 sec.

    Auriez-vous une solution plus perfomante à me proposer ?

    Merci d'avance !

  2. #2
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Une récursion?

    Je vous invite à consulter le blog de SQLpro sur les CTE et le mécanisme de récursion offert par SQL Server.


    http://sqlpro.developpez.com/cours/s...te-recursives/

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  3. #3
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour Lyche,

    Mon problème est bien un problème de récursion

    Merci pour ton lien très intéressant, je vais prendre un peu de temps pour étudier ça mais apparemment il n'est nul fait mention du type HierarchyId de SQL Serveur (je ne suis pas maître de la structure de la base et je suis obligé de l'utiliser).

    Sinon de mon côté j'ai trouvé une solution beaucoup plus véloce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM [maTable] Child
    WHERE [HierarchyId].GetAncestor([HierarchyId].GetLevel()-1) IN (
    	SELECT [HierarchyId] FROM [maTable] Parent IN (SELECT ...)
    )

  4. #4
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par ValM-ENI Voir le message
    Bonjour Lyche,

    Mon problème est bien un problème de récursion

    Merci pour ton lien très intéressant, je vais prendre un peu de temps pour étudier ça mais apparemment il n'est nul fait mention du type HierarchyId de SQL Serveur (je ne suis pas maître de la structure de la base et je suis obligé de l'utiliser).

    Sinon de mon côté j'ai trouvé une solution beaucoup plus véloce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM [maTable] Child
    WHERE [HierarchyId].GetAncestor([HierarchyId].GetLevel()-1) IN (
    	SELECT [HierarchyId] FROM [maTable] Parent IN (SELECT ...)
    )
    Tu pourrais éclaircir ton code via la CTE (la récursion n'est qu'une des utilisation des CTE ).

    De plus, pour des questions de "normes" je te conseil de toujours mettre le nom du ton schema quand tu appelles une table dans lton FROM


    Le type hierarchyId est plus récent que l'article, c'est pour ça qu'il n'y fait pas mention

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  5. #5
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour tes conseils.

    Je compte bien parcourir le cour sur les "requêtes récursives avec les CTE" ça me permettra d'avoir une autre vision des problèmes à résoudre.

  6. #6
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par ValM-ENI Voir le message
    Merci pour tes conseils.

    Je compte bien parcourir le cour sur les "requêtes récursives avec les CTE" ça me permettra d'avoir une autre vision des problèmes à résoudre.
    C'est une très bonne idée, c'est indispensable de nos jours. De plus, question maintenance c'est quand même une autre histoire.


    Je t'encourage donc,

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

Discussions similaires

  1. [XmlListModel] Récupérer tous les enfants
    Par Jiyuu dans le forum Qt Quick
    Réponses: 0
    Dernier message: 13/03/2015, 18h08
  2. Trouver tous les enfants et sous enfants d'un parent
    Par DEV-10 dans le forum Développement
    Réponses: 5
    Dernier message: 24/08/2009, 15h29
  3. Récupérer tous les champs de même nom
    Par hlr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/02/2005, 13h26
  4. Réponses: 7
    Dernier message: 08/01/2005, 13h24
  5. [Plugin] Récupérer tous les fichiers *.java d'un workspace
    Par Satch dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 02/06/2004, 12h51

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