Je suis assez nouveau à SQL et j'ai une question assez fondamentale. Supposons que je traite avec la structure de table suivante: 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. P> Les deux questions que j'ai alors: p> 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. P> p>
Sélectionnez la relève CODE> 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. Li>
sélectionner code> instruction plus efficace? LI>
ol>
3 Réponses :
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;
Je ferais:
select * from nodes where id not in (select parent from nodes where parent is not null)
Ce choix me laisse avec un résultat vide?
Fixé. Un où code> prédicat doit être ajouté à la sous-requête.
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 code> subquiery ou équivalent suffit. Pourtant, un autre équivalent à ceux déjà affichés utiliserait le
sauf code> Définir le fonctionnement: p>
Je vois rarement des gens en utilisant sauf / moins. +1
Quelle version de mysql utilisez-vous?
supposer 8.0 est ok
Cela lit beaucoup comme une mission de devoirs.