7
votes

Comment obtenir tous les enfants d'un nœud dans la structure des arbres? Requête SQL?

Table - Utilisateur

colonnes - (Userid, nom, gestionnaireId)

lignes - xxx

Si je donne un identifiant d'utilisateur, il devrait énumérer tous les personnes qui lui rendent compte. Si je donnais userid = 2, il devrait renvoyer 3,4.

est cette requête correcte xxx

existe un moyen efficace de gérer la structure des arbres dans dB ? Que diriez-vous de la route droite et gauche?


4 commentaires

Quel type de base de données utilisez-vous?


Si vous recherchez des méthodes alternatives de mettre en œuvre des hiérarchies dans une base de données relationnelle, vous pouvez consulter cette présentation. Slideshare.net/billkarwin/models-for-Hierarchical-Data


Très important de connaître le moteur de base de données. Ce que vous voulez, c'est la clause "avec" mais ce n'est pas universellement soutenu.


"Avec" la clause s'appelle "expression de table commune récursive" et est supportée par PostgreSQL, Firebird, Oracle, DB2, SQL Server, Sybase et H2


5 Réponses :


-1
votes
SELECT user.id FROM user WHERE user.managerid = 2
Is this what you want?

8 commentaires

Ne semble pas comme une structure d'arbre.


Aucun homme c'est une structure d'arborescence ici, je donne un identifiant parent puis je devrais obtenir un identifiant de tous les nœuds directs ou indirects.


Si vous donnez à ID utilisateur = 1, il devrait-il renvoyer 2, 3, 4 ou seulement 2?


@Nileh - Cette requête donne la sortie exacte que vous avez demandée. Si vous voulez quelque chose d'autre, vous devez mettre à jour votre question.


@MIKAEL ERIKSSON Je veux une chose plus efficace que celle-ci .imagine j'ai 10000 disques. Cette requête prendra beaucoup de temps. C'est une autre façon ??


Cette requête est parfaite pour cette fin))) Si vous n'avez besoin que de 2 userid = 1)))


Les gars veuillez envisager le facteur de performance en cas de million de documents, veuillez suggérer tout changement de structure de table pour une récupération plus rapide de tous les enfants.


Si vous avez besoin de construire des arbres avec tous les nœuds et les feuilles, le meilleur moyen est de sélectionner toutes les lignes commandez-la par parent_id et de la construire à l'aide de votre PROG Lang ... mais de toute façon si la table est immense, elle ne fonctionnera pas très vite, causez-la. est impossible de cacher un éléphant dans la boîte des matchs))))



12
votes

quelque chose comme ça (ANSI SQL):

WITH RECURSIVE emptree (userid, name, managerid) AS (
    SELECT userid, 
           name, 
           managerid
    FROM the_table 
    WHERE userid = 2

    UNION ALL

    SELECT c.userid, 
           c.name,
           c.managerid
    FROM the_table c
       JOIN emptree p ON p.userid = c.managerid
)
SELECT *
FROM emptree


5 commentaires

David Steele Réponse est plus efficace que la tienne! Bien essayé :)


Mais seulement si l'arbre ne change pas très souvent.


A_HORSE_WITH_NO_NAME est correct, mais si cela est vraiment destiné aux gestionnaires et au personnel, il est indéniable de changer plus d'une fois par jour.


@David Steele: Absolument. Mais il est toujours bon de connaître toutes les options;)


Vous êtes correct .Ce modèle est bon quand il y a une récupération fréquente des nœuds que la mise à jour du nœud :)



10
votes

À mon avis, le problème avec le modèle de liste de adjacents est qu'il est difficile de traiter avec SQL, en particulier lorsque vous ne savez pas à quel point votre structure arborescence est profondément imbriquée.

la gauche et la droite Free Way 'Vous mentionnez est probablement le modèle de jeu imbriqué et vous permet de stocker des choses comme celle-ci p> xxx pré>

alors vous pouvez trouver toutes les subordonnées de Anyones par simplement P>

SELECT Name FROM Hierarchy WHERE LFT BETWEEN @LFT AND @RGT


5 commentaires

Le modèle d'adressage est très facile à traiter si le SGBD prend en charge des requêtes hiérarchiques (qui presque tous les DBM principaux font de nos jours)


@ David Steele mec tu es superbe! Je m'attendais à cette réponse :)


Bon point, j'ai besoin de regarder ceux-ci. Cependant, je pense toujours que si les données ne changent pas beaucoup NS sont souvent la voie à suivre car les requêtes pour la lecture des données sont tellement plus faciles à écrire et à comprendre.


Merci Nilesh. Content que tu aimes ça.


Selon la base de données que vous utilisez, la liste d'adjacence modale peut être beaucoup plus rapide. Voir ExplanTextened.com/2009/09/24/ ... .



13
votes

J'utilise un champ de texte pour faire face aux arbres dans SQL. C'est plus facile que d'utiliser des valeurs gauche / droite.

Permet de prendre l'exemple de l'article MySQL: p>

SELECT * FROM theTable WHERE Lineage LIKE '/1/7/%'


9 commentaires

Il traite des cartes sauvages dans SQL qui n'est pas si fiable. Je ne suis pas efficace.


a) pas fiable? Exactement ce qui n'est pas fiable? B) Je ne dis pas qu'il s'agit d'une solution générique travaillant pour tous les scénarios. Quelle est la profondeur de votre arbre d'employé? Ce n'est pas un problème. c) Je suis difficile de voir comment il peut entraver la performance dans votre cas. Semble une optimisation prématurée.


mec vous exécutez une requête en SQL avec une carte sauvage et avec des numéros de comparaison .Query pour Wild Card prendront plus de temps .hence plus de temps de récupération pour tous les enfants. Deux fois où j'avais pris approche comme vous, mais ce n'est pas si efficace.


Je ne dis pas que votre approche est tort que je dis que ce n'est pas si efficace.;)


Combien d'employés avez-vous? Quelques milliers de mille au plus? La différence ne sera pas notable. Tout ce que je dis, c'est que Tout le code peut reflété plus efficacement. Utilisez toujours la solution la plus lisible, sauf si vous pouvez prouver que votre application obtiendra une différence notable de vitesse.


Leaf gauche et le concept de feuille droite est très simple à comprendre .Si vous lisez cela avec un esprit cool, je suis sûr que vous appuierez cette solution. lire - dev.mysql.com/tech-resources/articles/hierarchical- data.html


Je n'ai pas commenté que du tout, et je ne vois pas comment votre commentaire est pertinent pour ma réponse? J'ai écrit une réponse car il y a plusieurs approches du problème. Tous ont leurs avantages et leurs inconvénients.


Solution incroyable que je connais la performance, mais il n'y a tout simplement pas de meilleur moyen pour moi depuis que je traite de la table existante et des œuvres vraiment rapides sur des milliers de lignes et utilisez l'entité Framework


C'est la meilleure solution pour interroger des arbres dans des applications simples (la mine était une autorisation de sécurité selon les graphiques organisationnels) Insertion et la mise à jour n'est pas très compliquée que les jeux imbriqués, mais la requête est encore plus pratique, les performances peuvent également être fortement renforcées avec un index.



0
votes

J'ai une réponse simple à cette question:

Création de la table: P>

Drop table #AllChilds


0 commentaires