Comment implémenter une instruction SELECT «hasChildren» en SQL?
Question
Disons que j'ai le tableau suivant:
ID | parentID | MoreStuff
1 | -1 | ...
2 | 1 | ...
3 | 1 | ...
4 | 2 | ...
5 | 1 | ...
Comment puis-je générer une instruction SQL SELECT pour savoir si une ligne spécifique a des enfants? En d’autres termes, je veux savoir si l’ID 1 a des enfants, alors qu’il en a 3.
Je ne sais pas comment créer l'instruction SQL:
SELECT ID, hasChildren FROM myTable;
Qu'est-ce qui serait remplacé pour hasChildren dans l'instruction SQL SELECT ci-dessus?
La solution
Pas de version de groupe:
SELECT MyTable.Id, CASE WHEN EXISTS
(SELECT TOP 1 1 --you can actually select anything you want here
FROM MyTable MyTableCheck
WHERE MyTableCheck.ParentId = MyTable.Id
) THEN 1 ELSE 0 END AS HasRows
FROM MyTable
Autres conseils
Rejoignez la table sur elle-même pour savoir si elle a des enfants:
SELECT
parent.id as ID
, case when count(child.id) > 0 then 1 else 0 end as hasChildren
FROM myTable parent
LEFT JOIN myTable child
ON child.parentID = parent.ID
GROUP BY parent.id
Si vous connaissez déjà l'ID parent, la requête est simple: il vous suffit de sélectionner le nombre de lignes portant cet ID parent.
SELECT count(*) FROM myTable where parentID = 1;
Il existe des réponses très valables à votre question qui fonctionneront. Toutefois, je considérerais les performances d’une telle requête si votre jeu de données est très volumineux.
Si vous allez utiliser une requête Group By ou Sub pour obtenir les données, assurez-vous que les colonnes ID et Parent possèdent des index distincts.
Pour obtenir des performances encore meilleures, vous devez ajouter une colonne intitulée "haschildren". ce qui pourrait être un "bit" Type de données. Cette colonne doit ensuite être mise à jour à partir du code de votre application lorsque des éléments sont insérés ou supprimés. Cela vous permettrait d’exécuter la requête beaucoup plus rapide:
SELECT * FROM table WHERE haschildren IS NOT NULL
Les solutions ci-dessus sont acceptables, mais vous ne devriez pas ajouter de colonne comme "haschildren" sauf si vous avez vraiment un problème de performances (voir l'article de GateKiller). Une telle colonne dénormalise la base de données, c’est-à-dire que les mêmes informations sont stockées à deux endroits, ce qui augmente les risques de perte de cohérence de vos données. Vous devrez gérer cette colonne chaque fois que vous insérez un nouvel enfant, en supprimez un déjà existant ou mettez à jour le parent d'un enfant.