0
votes

SQL Obtenez des feuilles de graphique acyclique dirigé

Je suis assez nouveau à SQL et j'ai une question assez fondamentale. Supposons que je traite avec la structure de table suivante: xxx

Si nous détenons un invariant qui dit, le parent d'un nœud ne peut pas être équivalent à l'un de ses enfants, puis par définition nous ne ferons pas avoir des boucles dans notre graphique. Maintenant, nous sommes laissés avec un graphique acyclique dirigé par disjoint.

Les deux questions que j'ai alors:

  1. Si nous ne pouvons pas modifier la structure de la base de données: quel Sélectionnez la relève Devrais-je écrire pour obtenir efficacement toutes les feuilles de ma base de données? C'est à dire. les identifiants qui n'ont pas d'enfants.
  2. Si nous pouvons changer la structure des tables: Que pourrions-nous modifier ou ajouter pour faire de cette sélectionner instruction plus efficace?

    un exemple de sortie pour le graphique avec cinq nœuds dont les parents où les parents où 3-> 2, 2-> 1 et 5-> 4 sortiraient 3 et 5 parce qu'ils sont les seuls nœuds qui ne font pas avoir des enfants.


3 commentaires

Quelle version de mysql utilisez-vous?


supposer 8.0 est ok


Cela lit beaucoup comme une mission de devoirs.


3 Réponses :


1
votes

Vous pouvez utiliser n'existe pas code> et une sous-requête corrélée qui vérifie le nœud où le courant n'est pas le parent. Pour les feuilles, aucun enregistrement de ce type ne peut exister.

SELECT *
       FROM nodes n1
            LEFT JOIN nodes n2
                      ON n2.parent = n1.id
       WHERE n2.id IS NULL;


0 commentaires

0
votes

Je ferais:

select *
from nodes
where id not in (select parent from nodes where parent is not null)


2 commentaires

Ce choix me laisse avec un résultat vide?


Fixé. Un prédicat doit être ajouté à la sous-requête.



1
votes

Pour des requêtes de graphique plus complexes, vous pouvez utiliser des expressions de table communes (CTES), normalisées dans SQL: 99 et prise en charge dans MySQL depuis 8.0.1 (référence)

mais comme d'autres ont souligné, pour la requête qui vous intéresse, Un simple n'existe pas subquiery ou équivalent suffit. Pourtant, un autre équivalent à ceux déjà affichés utiliserait le sauf Définir le fonctionnement: xxx


1 commentaires

Je vois rarement des gens en utilisant sauf / moins. +1